固定形式のテキストファイルを繰り返し、ファイル内のデータ行内の1つ以上の特定の文字位置(最初の文字位置を含む)で特定の文字を見つける方法を探しています。これらの位置のうち、文字基準に一致する位置がある場合は、そのレコード/行を出力したいと思います。このタスクを実行できるgrepまたはawkコマンドを持つ人はいますか?たとえば、ファイルXの5、10、または25の場所でアスタリスク(*)を見つけるには、awkまたはgrepでどうすればよいですか?ファイルの例
cat test.txt
* * *
* X *
* * Y
* X Y
答え1
grep '^\(.\{4\}\|.\{24\}\)\*' X
ファイル内のすべての行を探します。
答え2
おそらく次のawk
行はあなたがよりよく理解するのに役立ちます
printf '%s\n' "foo bar *" foo "more foo * more * foo and baz" "another foo bar foo" | awk '{for (i=1;i<=NF;i++) if ($i=="*") print $i " appears in field: " i}'
フィールドを繰り返してパターンに合わせて印刷するのと同じくらい簡単です。
答え3
少なくともwithgawk
とmawk
空のフィールド区切り文字を設定して、各文字をフィールドとして扱うことができます。たとえば、あなたはできます
gawk -F '' '$5 == "*" || $10 == "*"' test.txt
これにより、一致するレコード(行)がデフォルトの印刷規則を使用して印刷されます。
同様のトリックperl
(フィールドのインデックスは0です)
perl -F'' -ane 'print if $F[4] eq "*" || $F[9] eq "*"' test.txt