どこでも2つの文字列を含むファイルからすべての行を抽出します。

どこでも2つの文字列を含むファイルからすべての行を抽出します。

次のような内容を含む .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
}

このプログラムは、次のコマンドを使用して行を抽出するのにも適しています。特定特定のアイテムの一致数。

おすすめ記事