awk:異なるフィールド区切り文字を使用して別の列で機能する方法

awk:異なるフィールド区切り文字を使用して別の列で機能する方法

複数のファイルを使用して特定の文字列を含む列を抽出しようとしますが、ファイルごとにフィールド区切り文字が異なり、ファイルによって文字列が異なる列に表示されます。

ファイル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

関連情報