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

给出以下命令:

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

为什么awk输出:

 1: 

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

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

如果您想以编程方式执行此操作,则可以使用FSvariables:

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

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

-Fawk本身的一个参数:

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

你有多种方式来设置:作为分隔符:

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

所有这些都是等价的,对于样本input“1:2:3”将返回1

 $ 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 

您也可以使用正则expression式作为字段分隔符,以下将使用正则expression式将数字“10”设置为分隔符来打印“条”。

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

AWK作为文本解释器,对整个文档 进行逐行扫描,并对每行进行逐行扫描,因此$ 1,$ 2 .. $ n是对每行字段的引用($ 1是第一个字段,$ 2是第二个字段等等…)。 您可以使用命令行下的“-F”开关或“FS = …”在两个括号内定义字段分隔符。 现在考虑“JUERGEN”的答案:

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

在字段边界之上由“:”设置,所以我们有两个文件$ 1,它是“1”,$ 2是空的空间。之后是正则expression式“/ 1 /”,指示filter只输出第一个字段当口译员偶然发现含有这样的expression(我的意思是1); “回声”命令的输出是包含“1”的一行,所以filter将工作…

在处理下面的例子时:

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

语法混乱, 解释器select忽略部分F“:”,并切换到默认字段分隔符(即空字符),从而输出“1:”作为第一个字段,并且不会有第二个字段!

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

没有必要写这么多。 只需在awk命令中使用-F选项将所需的字段分隔符和想要打印的列号按照您提到的字段分隔符分隔。

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

或者你可以使用:

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

这真是有趣的方程式。