使用 awk 用多字符分隔符分隔字段

使用 awk 用多字符分隔符分隔字段

我想打印由 分隔的行中的字段|~^。我尝试了很多方法,但无法使用 打印字段awk。以下是文件内容供参考。

输入

H|~^20200425|~^abcd|~^sum
R|~^abc|~^2019-03-05|~^10.00
R|~^abc|~^2019-03-05|~^20.00
R|~^abc|~^2019-03-05|~^30.00
R|~^abc|~^2019-03-06|~^100.00
R|~^abc|~^2019-03-06|~^15.00
R|~^abc|~^2019-03-06|~^10.00
T|~^20200425|~^6|~^185.00

我需要|~^使用基于分隔符分隔字段awk。我试过

cat input |grep "^T"|awk -F '|~^' '{print $2}'

但它返回 null。

有什么建议么?

答案1

awk我认为您面临的问题与 (GNU)联机帮助页 [1]中的以下声明有关:

如果 FS 是单个字符,则字段由该字符分隔。如果 FS 是空字符串,则每个单独的字符将成为一个单独的字段。否则,FS 应该是一个完整的正则表达式

由于您的字段定界模式包含在正则表达式中具有特殊含义的字符(the|和 the ^),因此您需要正确对它们进行转义。由于awk解释变量的方式(解析字符串文字)两次),您需要指定使用双反斜杠,如

awk -F '\\|~\\^' '{print $2}' input.txt

您的示例的结果输出:

20200425
abc
abc
abc
abc
abc
abc
20200425

要仅考虑以 开头的行T,请使用

awk -F '\\|~\\^' '/^T/ {print $2}' input.txt

或者,通过仅选择某个字段(此处为第一个字段)的值为T:的行:

awk -F '\\|~\\^' '$1=="T" {print $2}' input.txt

两种情况下示例的结果

20200425

请注意,一般来说,很少需要结合使用awk,grep和。sed此外,所有这些工具都可以直接访问文件,因此cat也不需要向它们提供要处理的文本。

[1]:作为(不相关的)旁注:带有“空字符串”的部分并不适用于所有 Awk 变体。 GNU Awk 手册指出“这是一个常见的扩展;POSIX 标准没有指定它”。

答案2

找到了一个例子这里并稍作修改:

另一种方法是将其替换为其他分隔符并使用它:

cat infile |sed "s/|~^/,/g"
H,20200425,abcd,sum
R,abc,2019-03-05,10.00
R,abc,2019-03-05,20.00
R,abc,2019-03-05,30.00
R,abc,2019-03-06,100.00
R,abc,2019-03-06,15.00
R,abc,2019-03-06,10.00
T,20200425,6,185.00

$ cat infile |sed "s/|~^/,/g" | cut -d',' -f2-3
20200425,abcd
abc,2019-03-05
abc,2019-03-05
abc,2019-03-05
abc,2019-03-06
abc,2019-03-06
abc,2019-03-06
20200425,6

2after-f是起始列,3是结束列。

相关内容