ファイルの特定の部分を抽出する方法は?

ファイルの特定の部分を抽出する方法は?

複数行を含む複数のファイルがあります。その中で、私は次の特定のパターンで始まる行にのみ興味があります。

USER1    Info> :FERRARI:RED,:LAMBORGHINI:ORANGE,:MASERATI:BLUE,...

この例では(示されているようにスペースを含む)

この行では、自動車メーカー情報(カラーなし)のみが必要なため、出力は次のようになります。

FERRARI, LAMBORGHINI and MASERATI

自動車ブランドはファイルごとに常に異なります。この例では3つの自動車ブランドを入力していますが、各ファイルにはその数が多いか少ない場合があります。 BashやPythonでこれを行う簡単な方法はありますか?ありがとう

ベストアンサー1

2つのコロンの間のすべての単語を抽出します(カンマを除く)。

grep -oHnE ":[^,]*:" files* | awk 'BEGIN{FS=":"} {x=$1$2; a[x]=a[x]","$4} END{for(x in a) print a[x]}' | sed 's/^,//'

car_info.txt ファイルがあるとします。

cat car_info.txt
USER1    Info> :FERRARI:RED,:LAMBORGHINI:ORANGE,:MASERATI:BLUE
USER1    Info> :FERRARI:RED,:LAMBORGHINI:ORANGE
USER1    Info> :FERRARI:RED,:LAMBORGHINI:ORANGE,:MASERATI:BLUE


grep -oHnE ":[^,]*:" car_info.txt 
car_info.txt:1::FERRARI:
car_info.txt:1::LAMBORGHINI:
car_info.txt:1::MASERATI:
car_info.txt:2::FERRARI:
car_info.txt:2::LAMBORGHINI:
car_info.txt:3::FERRARI:
car_info.txt:3::LAMBORGHINI:
car_info.txt:3::MASERATI:

grep

  • -o一致する行のうち一致する部分のみを印刷
  • -Hファイル名の印刷
  • -n行番号の印刷
  • -E拡張正規表現のサポート

戦略は、同じ内容を含む行をfilename:line1行に表示することです。

awk 'BEGIN{FS=":"} {x=$1$2;a[x]=a[x]","$4} END{for(x in a) print a[x]}'
  • BEGIN{FS=":"}フィールド区切り記号を次のように設定します。:
  • x=$1$2入れてfilenameまたline入れてx
  • akey=を使用してキー値を生成し、x各行の値に4番目のフィールドを追加します。x
  • for(x in a) print a[x]キーと値のペアの値を印刷します。a

sed 's/^,//',行の先頭から削除するために使用されます。

おすすめ記事