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

时间:2010-04-09 17:30:51

标签: bash awk gawk

给出以下命令:

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

为什么awk输出:

1: 

7 个答案:

答案 0 :(得分:330)

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

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

答案 1 :(得分:55)

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

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

请注意,如果您在主循环而不是BEGIN循环中更改它,则会读入 next 行,因为当前行已被拆分。< / p>

答案 2 :(得分:23)

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

awk -F: '{print $1}'

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

awk '{print $1}' FS=:

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

所有这些都是等效的,并且对于样本输入将返回1&#34; 1:2:3&#34;:

$ 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

答案 3 :(得分:11)

-Fawk本身的一个参数:

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

答案 4 :(得分:5)

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

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

在字段上方边界由“:”设置,所以我们有两个文件$ 1是“1”而$ 2是空的空格。之后,正则表达式“/ 1 /”指示过滤器输出第一个字段,只有当解释器偶然发现包含这种表达式的行时(我的意思是1); “echo”命令的输出是一行包含“1”,因此过滤器将起作用...

处理以下示例时:

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

语法很乱,解释器选择忽略F“:”部分 并切换到默认的字段拆分器,这是空的sapce,因此输出“1:”作为第一个字段,并且不会有第二个字段!

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

答案 5 :(得分:4)

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

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

答案 6 :(得分:2)

或者您可以使用:

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

这真是一个有趣的方程式。