複数の区切り文字を持つAwk抽出フィールド

複数の区切り文字を持つAwk抽出フィールド

ファイルの内容は次のとおりです。

AB: 20190131  13 J-1|19:30:00.000000000 18:06:00.000000000 123466  50 @TEST . "" 1234 - I . ".." "" "" "TEST TEXT 1" "TEXT 2: Sr of human happiness. To obtain some advantage from it? But who has any right to find f.==Required file.csv.gz FIELD*SERVER-TIME*05:29:51.981378000" "" NoTime
AB: 20190131  1 J-1|19:30:00.000000000 18:06:00.000000000 123466  50 @TEST . "" 1234 - I . ".." "" "" "TEST TEXT 1" "TEXT 2: Sr of human happiness. To obtain some advantage from it? But who has any right to find f.==Required file2.csv.gz,Required file5.csv.gz FIELD*SERVER-TIME*05:29:51.981378000" "" NoTime

最初のフィールドをフィールド区切り文字(==)として使用して、*csv.gzファイル名の後に続く3番目のフィールドを印刷したいと思います。

サンプル出力は次のとおりです。

13,Required file.csv.gz
1,Required file2.csv.gz,Required file5.csv.gz

次のコマンドを使用してファイル名を抽出できます。

awk -F "==" '/.csv.gz/{print $2}' | awk '{print $1}'

ただし、同じ行の3番目のフィールドを取得できません。

答え1

あなたはmatch()それを使用することができますプログラム開始長さそしてsubstr()

awk 'match($0,/==.*?.csv.gz/){print $3","substr($0, RSTART+2, RLENGTH-2)}' file 

どこ

match()パターンに一致する部分文字列を見つけるために関数を使用します/==.*?.csv.gz/。一致する行について、我々は得るでしょうプログラム開始そして長さ一致するテキストの位置と長さを識別してから(および一致するテキストから先行する '=='削除)をsubstr($0, RSTART+2, RLENGTH-2)使用してテキストを検索します。+2-2

答え2

この試み、

オプション1:

awk '{gsub(/f.==/, ""); print $3","$(NF-4)" "$(NF-3)}' file

13,Required file.csv.gz
  • gsub"f.=="をnullに置き換えます。
  • 最初から3番目のフィールドを印刷し、行の最後に4番目と3番目のフィールドを印刷します。

オプション2:

echo "`awk '{ print $3}' file && awk -F '==' '{print $2}' file| awk '{print $1" "$2}'`" | tr '\n' ','
  • スペースを区切り文字として使用して、3番目の列を印刷します。
  • "==" を区切り文字として使用して 2 番目の列を解析し、スペースを区切り文字として使用して最初と 2 番目の列を印刷します。
  • カンマに改行を変換

注:オプション2はシングルライン入力でのみ機能します。

答え3

awkを使用してください。

awk '{
        printf "%s,", $3
        match($0, /Required [a-z]+\.csv\.gz/, a)
        print a[0]
    }' /tmp/file

2つのコマンドがあります。

awk '{printf "%s,", $3}' /tmp/file
grep -oP 'f.==\KRequired \w+.csv.gz' /tmp/file

出力

13,Required file.csv.gz

関連情報