文件内容如下
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