如何使用“:”作为awk字段分隔符?


243

给定以下命令:

echo "1: " | awk '/1/ -F ":" {print $1}'

为什么awk输出:

1: 

Answers:


382

“ -F”是命令行参数,而不是awk语法,请尝试:

 echo "1: " | awk -F  ":" '/1/ {print $1}'

42
这里无知的问题:/ 1 /部分是告诉awk只处理包含数字1的行(或更精确的记录)吗?
rantsh

3
@rantsh Awk语法看起来像(pattern){action}。如果pattern(主要是条件语句)为trueaction则执行。如果pattern不可用,true则暗示。这里pattern/1/其中规定的正则表达式1在当前记录匹配$0
kvantour

62

如果要以编程方式执行此操作,则可以使用FS变量:

echo "1: " | awk 'BEGIN { FS=":" } /1/ { print $1 }'

请注意,如果您在主循环而不是BEGIN循环中更改它,则它将影响下一个读入的行,因为当前行已被拆分。


35

您可以通过多种方式将其设置:为分隔符:

awk -F: '{print $1}'

awk -v FS=: '{print $1}'

awk '{print $1}' FS=:

awk 'BEGIN{FS=":"} {print $1}'

它们都是等效的,并且对于1样本输入“ 1:2:3” 将返回:

$ awk -F: '{print $1}' <<< "1:2:3"
1
$ awk -v FS=: '{print $1}' <<< "1:2:3"
1
$ awk '{print $1}' FS=: <<< "1:2:3"
1
$ awk 'BEGIN{FS=":"} {print $1}' <<< "1:2:3"
1

哪个是首选方式?我认为带有该BEGIN语句的最终示例将是最正确的(与整体awk语法一致)。

1
@randomware都很好。BEGIN如果我使用文件来存储整个内容,则倾向于使用它,而-F单行代码则很方便。
fedorqui'SO停止伤害'18

1
必须说,第三种情况与所有其他情况之间存在细微的差异。示例:awk 'BEGIN{print split("foo:bar",a)}' FS=":" fileawk 'BEGIN{FS=":"; print split("foo:bar",a)}' file
kvantour



6

您还可以使用正则表达式作为字段分隔符,下面将通过使用正则表达式将数字“ 10”设置为分隔符来打印“条”。

echo "foo 10 bar" | awk -F'[0-9][0-9]' '{print $2}'

4

无需写太多。只需在awk命令中将带有-F选项的所需字段分隔符放在您要打印的列号中,即可按照您提到的字段分隔符进行分隔。

echo "1: " | awk -F: '{print $1}'    
1

echo "1#2" | awk -F# '{print $1}'  
1

4

AWK作品文本翻译是去面向行整个文档那去fieldwise每行因此$ 1,$ 2 .. $ n的每一行的字段引用($ 1是第一个字段,$ 2是第二场等等...)。您可以通过在命令行下或两个带有“ FS = ...”的方括号内使用“ -F”开关来定义字段分隔符。现在考虑“ JUERGEN”的答案:

echo "1: " | awk -F  ":" '/1/ {print $1}'

字段边界上方由“:”设置,因此我们有两个字段$ 1(即“ 1”)和$ 2(其为空白)。之后是正则表达式“ / 1 /”,指示过滤器仅输出第一个字段当口译员偶然发现一行包含这样的表达式时(我的意思是1);“ echo”命令的输出是包含“ 1”的一行,因此过滤器将起作用。

处理以下示例时:

echo "1: " | awk '/1/ -F ":" {print $1}'

语法混乱,解释器选择忽略部分F“:”, 并切换到默认字段分隔符,该分隔符为空白,因此输出“ 1:”作为第一个字段,不会有第二个字段!

JUERGEN的答案包含良好的语法...


2

或者您可以使用:

echo "1: " | awk  '/1/{print $1-":"}' 

这真是有趣的方程式。


1
什么/1/意思

找到一个模式。在这种情况下,“1”
何塞·迪亚斯
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.