複数のファイルを使用して特定の文字列を含む列を抽出しようとしますが、ファイルごとにフィールド区切り文字が異なり、ファイルによって文字列が異なる列に表示されます。
ファイル1の例行(区切り:
):
sss:string1:rrr
ファイル2の例行(区切り,
):
sss,sss,string321,sss,sss
ファイル3の例行(区切り'
):
example'e123'string2'lol
awk
または、他のコマンドラインツールを使用して上記の3つのファイルで「文字列」をどのように見つけることができますか?
私は以下を実行できることを知っていますfile 1
。
awk -F: '$2 ~ /string/ {print $2}'
出力は次のとおりです。
string1
ただし、各ファイルを個別に処理するのに時間がかかるため、複数の区切り文字と複数の列を持つ複数のファイルに対してこれを行いたいと思います。できますか?
答え1
3回の個別通話を行います。
awk -F: '{print $2}' file1
awk -F, '{print $3}' file2
awk -F\' '{print $3}' file3
おそらくこれほどスピードでしょう。
awk '
FILENAME == "file1" && FNR == 1 {FS = ":"; col = 2; $0 = $0}
FILENAME == "file2" && FNR == 1 {FS = ","; col = 3; $0 = $0}
FILENAME == "file3" && FNR == 1 {FS = "'\''"; col = 3; $0 = $0}
{print $col}
' file1 file2 file3
もちろん、電子が読んで維持するのは簡単です。
〜のようにZen of Piton彼らは複雑さよりも単純さが良いと言います。
答え2
1 つのコマンドでこれを行うには、次のように動作します。
awk -F : '{print $2}' file1 && awk -F : '{print $3}' file2 && awk -F : '{print $3}' file3
すると、以下が出力されます。
string1
string321
string2
string
印刷するだけで何も含めない場合は、次の手順を実行します。
awk -F : '{print substr($2,1,6)}' file1 && awk -F , '{print substr($3,1,6)}' file2 && awk -F \' '{print substr($3,1,6)}' file3
説明する:
substr($2,1,6)
最初の位置から始まり、6文字を含む2番目のフィールドの部分文字列を印刷しますstring
。出力は次のとおりです
string
string
string