簡體   English   中英

awk腳本無法更改字段分隔符

[英]awk script not able to change field separator

我從這里獲取以下腳本

#!/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

所以我的問題是,為什么某些行缺少第三個字段?

您可以將FS設置為兩個字符

$ awk -F'[ :]' '{print $3}' file

要么

$ awk 'BEGIN{FS="[: ]"} {print $3}' file

如果需要的話,可以將單引號之間的部分移至腳本文件。

在AWK腳本中,記錄和字段分隔符用於拆分下一個字段。 這就是為什么通常將它們設置在BEGIN子句中的原因。

如果需要根據當前字段的內容拆分當前內容,則必須使用split功能,例如

arr_len = split($0, my_array, /:/);
if (arr_len > 3) {
    print my_array[3]
} else {
    ....
}

我建議使用以下快速參考來提供幫助:

Shell腳本入門[如何AWK-ward]

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上測試過的原始腳本改編版(差異通常不是其他結果的來源)。 兩者都正確地給出了第三個值。 您在哪個系統上?

假設您的樣本數據結構(沒有空格或“:”的混合),您可以通過類一次嘗試使用兩個分隔符(特別是對於mac問題)

awk -F '[: ]' '{ print $3 }' YourFile

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM