次のような内容を含む .txt ファイルがあります。
- 100150180200300400
- 100200250350380400
- 100160170400450500
- 100120140160180200
- 100120140160180300
「100」と「200」を含む特定の列(たとえば、2、3、またはその他の列)から始めてすべての行をインポートし、別の別のtxtファイルに出力したいと思います。どうすればいいですか?上記の例では、正しい印刷は次のようになります。
- 100150180200300400
- 100200250350380400
- 100120140160180200
Sublimeの「すべて検索」機能を使用してから、行末の右矢印を使用して強調表示してみましたが、残念ながら一部の行は他の行よりはるかに長く、機能しません。
答え1
$ grep 100 <file | grep 200 >newfile
$ cat newfile
100 150 180 200 300 400
100 200 250 350 380 400
100 120 140 160 180 200
最初は、grep
元のファイルから文字列を含むすべての行を抽出します100
。 2番目はgrep
すべての行を抽出します。その結果、文字列を含みます200
。
この行には、目的の文字列が部分文字列として含まれているため、1100
などの文字列を含む行も抽出されます。1200
これを防ぐには、可能であればオプションgrep
と一緒に使用してください。-w
特定の列でのみ開始をテストするには、短いawk
プログラムを使用します。
$ awk -v col=1 '{ delete c; for (i=col; i<=NF; ++i) ++c[$i]; if (c[100] > 0 && c[200] > 0) print }' <file >newfile
$ cat newfile
100 150 180 200 300 400
100 200 250 350 380 400
100 120 140 160 180 200
プログラムawk
はコマンドラインから変数の値を取得しますcol
(ここで値は1です)。次に、列から始めて各入力行を繰り返し、col
各値が発生する回数を計算します。値の合計が0回以上100
発生した場合は、その行を印刷します。200
このプログラムはより良いレイアウトを持っています:
{
delete c
for (i=col; i<=NF; ++i)
++c[$i]
if (c[100] > 0 && c[200] > 0)
print
}
このプログラムは、次のコマンドを使用して行を抽出するのにも適しています。特定特定のアイテムの一致数。
答え2
誤検出が発生しないと確信している場合は、次のことを試すこともできます。
awk '{TMP = $0; sub ($1 FS $2, "")} /100/ && /200/ {print TMP} ' file