如何使用":"作为AWK字段分隔符?

给定以下命令,

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

为什么AWK输出:

1:

?

725050 次浏览

-F是命令行参数,不是AWK语法。试一试:

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

-Fawk本身的参数:

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

如果你想通过编程来实现,你可以使用FS变量:

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

注意,如果你在主循环中而不是在BEGIN循环中更改它,它将对读入的下一个行生效,因为当前行已经被分割了。

没有必要写这么多。只需将您想要的字段分隔符与AWK命令中的-F选项放在一起,并根据您提到的字段分隔符打印您想要分隔的列号。

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


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

AWK作为一个文本解释器整个文档都是这样的这对每一行都是场域的工作。因此$1,$2…$n是对每行字段的引用($1是第一个字段,$2是第二个字段,依此类推……)

可以使用"-F"在命令行下或在两个括号内加上"FS=…"。

现在考虑Jürgen的答案:

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

在区域上方,边界由":"这里有两个字段$1,分别是“;1”;和2美元空的空间。后面是正则表达式"/1/"它指示过滤器只有在解释器偶然发现包含这样一个表达式的行(我的意思是1)时才输出第一个字段。

echo的输出;命令是一行包含"1",所以过滤器将工作…

在处理以下示例时:

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

语法混乱,解释器选择忽略部分F ":" 并切换到默认的字段分割器,即空白空格,从而输出"1:"作为第一个字段,不会有第二个字段!< / p >

Jürgen的答案包含了良好的语法…

你有多种方法将:设置为分隔符:

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

也可以使用正则表达式作为字段分隔符。下面将打印“bar"通过使用正则表达式来设置数字“10”;作为分隔符。

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

或者你可以用:

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

这是一个非常有趣的方程。

echo "1: " | "456:abc:515:xyz "
awk -F: NF=/1/
      1    |  456

更新:意识到我之前的回答有多啰嗦