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 文件名,它作为字段分隔符的第一个字段 (==)

示例输出如下

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

我可以使用以下命令提取文件名

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

但无法获得同一行的第三个字段。

答案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将用 null 替换“f.==”。
  • 打印从头开始的第三个字段以及从行尾开始的第四个和第三个字段

选项2:

echo "`awk '{ print $3}' file && awk -F '==' '{print $2}' file| awk '{print $1" "$2}'`" | tr '\n' ','
  • 以空格作为分隔符打印第三列。
  • 使用“==”作为分隔符解析第二列,并用空格作为分隔符从中打印第一列和第二列。
  • 带逗号的转置换行符

注意:选项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

相关内容