我从here
获取以下脚本#!/usr/bin/awk -f
{
if ($0 ~ /:/) {
FS=":";
$0=$0;
} else {
FS=" ";
$0=$0
}
print $3
}
输入文件
ONE 1 I
TWO 2 II
THREE:3:III
FOUR:4:IV
FIVE:5:V
SIX 6 VI
SEVEN 7 VII
我的输出
I
II
IV
V
VII
所以我的问题是为什么某些行缺少第3个字段?
答案 0 :(得分:2)
您可以将FS设置为两个字符
$ awk -F'[ :]' '{print $3}' file
或
$ awk 'BEGIN{FS="[: ]"} {print $3}' file
您可以将单引号之间的部分移动到脚本文件中,如果这是您想要的。
答案 1 :(得分:1)
在AWK脚本中,记录和字段分隔符用于分割 next 字段。这就是为什么他们通常会在BEGIN
条款中设置的原因。
如果您需要根据当前字段的内容拆分当前内容,则必须使用split
功能,例如
arr_len = split($0, my_array, /:/);
if (arr_len > 3) {
print my_array[3]
} else {
....
}
我建议以下快速参考帮助:
答案 2 :(得分:1)
awk '
{
# force the FS
if ($0 ~ /:/) FS=":"
else FS=" "
# force awk to retreat the field separation with "new" line content
# because this is done at the start of the loop once (so earlier than)
# new FS assignation
$0 = $0
# print the 3th field
print $3
}
' YourFile
这是你在我的aix和linux上测试的原始脚本(通常不同于你的其他结果的来源)。两者都正确地给出了第3个值。你在哪个系统?
假设你的样本数据结构(没有空格或“:”),你可以通过一个类使用两个分隔符来尝试(特别是对于mac问题)
awk -F '[: ]' '{ print $3 }' YourFile