BBS-complangawk/319

トップ 差分 一覧 Farm ソース 検索 ヘルプ RSS ログイン

printing records containing a pattern - saylee (2006年06月25日 00時59分25秒)

"xyz" を含んだレコードのある全ての行を使います。

awk '{for (i=1;i<=NF;i++) if ($i ~ /xyz/) print $i }'

のようにしましたが、1 行に複数回ある場合には複数回プリントされます。

http://groups.google.co.jp/group/comp.lang.awk/browse_thread/thread/7a275e012e044763/ecdb24724b6584da?hl=ja#ecdb24724b6584da


Re: - Ed Morton (2006年06月25日 01時01分08秒)

awk '{fs=""; for (i=1;i<=NF;i++) if ($i ~ /xyz/){printf "%s%s",fs,$i;fs=FS} print "" }'

または

awk '
{fs=out="";for (i=1;i<=NF;i++) if ($i ~ /xyz/){out = out fs $i; fs=FS}}
out {print out}'

のようにします。あとは、マッチしなかった場合にどういう処理にするか次第です。

Re: - Xicheng Jia (2006年06月25日 01時02分19秒)

Perl じゃダメですか?

perl -lpe 's/.*?(\S*xyz\S*)|.*?/$1\t/g' myfile.txt

Re: - William Park (2006年06月25日 23時31分05秒)

以下のようにしてできます。

while read -A; do
   echo "${*|/xyz}"
done < file

Re: - William James (2006年06月25日 23時31分40秒)

以下のようにしてできます。

{for(i=1;i<=NF;i++)if($i!~/xyz/)$i=x;$0=$0;$1=$1}$0

Re: - Jon LaBadie? (2006年06月27日 00時59分56秒)

以下のようにしてできます。

awk '
# records that contain the pattern
 xyz  {
     n = 0
     for (i=1; i <= NF; i++)
         if ($i ~ /xyz/)
             printf("%s%s", ++n>1 ? OFS : "", $i)
     print ""
     next
}
# records that do not contain the pattern
# { print }
'

Re: - Xicheng Jia (2006年06月27日 01時00分27秒)

Perl だと以下のようになります。

perl -lne 'if(/xyz/) { @x = /\S*xyz\S*/g; print "@x" }' myfile.txt

Re: - William James (2006年06月27日 01時05分03秒)

Ruby なら以下のようにしてできます。

ruby -ane 'puts $F.grep(/xyz/).join(" ") if /xyz/'

これ、なかなか面白いです。(さいとう)

{{comment multi|w}}