我想打印由 分隔的行中的字段|~^
。我尝试了很多方法,但无法使用 打印字段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
2
after-f
是起始列,3
是结束列。