awk脚本无法更改字段分隔符

时间:2016-12-13 01:07:46

标签: bash awk

我从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个字段?

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 {
    ....
}

我建议以下快速参考帮助:

Shell Scripting Primer [How AWK-ward]

答案 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