複数行を含む複数のファイルがあります。その中で、私は次の特定のパターンで始まる行にのみ興味があります。
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:line
1行に表示することです。
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
a
key=を使用してキー値を生成し、x
各行の値に4番目のフィールドを追加します。x
for(x in a) print a[x]
キーと値のペアの値を印刷します。a
sed 's/^,//'
,
行の先頭から削除するために使用されます。
答え2
awk -F':' /^USER1.\*Info/' {print $2" "$4" "$6}' < infile