簡體   English   中英

如何讓 awk 不跳過空列?

[英]How to make awk not to skip empty columns?

鑒於此 input_file:

1234 1234 abcd
1234      abcd

當我運行時,awk 無法識別空列:

awk '{print $1,$2}' input_file

我得到:

1234 1234
1234 abcd

如何使 awk 給我:

1234 1234
1234 

awk程序通常使用字段分隔符來決定哪些字符屬於哪些字段。 如果您的第二行僅包含空格,則無法根據需要使用方法進行拆分。

但是,GNU awk允許您設置一個FIELDWIDTHS變量,它更適合固定寬度數據,因為這似乎是您所擁有的:

pax> cat infile
1234 5678 abcd
1234      abcd

pax> awk 'BEGIN{FIELDWIDTHS="4 1 4"}{print "<"$1","$3">"}' infile
<1234,5678>
<1234,    >

在這種情況下,它是第一個和第三個字段,因為第二個字段是第一個和第二個列之間的空間:

1234 5678 abcd
\__/|\__/|\__/
  1 2  3 4  5

我通常這樣做是因為我不希望空間成為數據的一部分(如果我想在輸出中使用不同的字符作為我的示例)但是,如果您無論如何要傳輸空間,您也可以使用更簡單:

pax> awk 'BEGIN{FIELDWIDTHS="5 4"}{print "<"$1$2">"}' infile
<1234 5678>
<1234     >

在這種情況下,字段 1 是五個字符1234<space>


如果你想要做固定寬度的處理很容易適應以后寬度變化的能力,你可以修改awk所以從文件本身信息的腳本。

不是來自實際數據行,因為那里的字段可能有空格,但您可以添加標題行以完全指定要使用的寬度(確保標題行當然不被視為數據)。

下面的文字記錄顯示了這一點( awk腳本現在在一個文件中,因為它變得復雜了):

pax> cat infile
#### ###### ####
1234 567890 abcd
1234        abcd

pax> cat awkfile.awk
NR == 1 {
    # Header: construct field widths string
    #    "a 1 b 1 c 1 d ... z"
    # where a..z are lengths of fields.

    FIELDWIDTHS = length($1)
    for (i = 2; i < NF; i++) {
        FIELDWIDTHS = FIELDWIDTHS" 1 "length($i)
    }
    next
}
{
    # Then use that FIELDWIDTHS string for
    # all other records.

    print "<"$1","$3">"
}

pax> awk -f awkfile.awk infile
<1234,567890>
<1234,      >

您會發現您可以根據需要隨意更改字段長度,並且如果標題行正確,它將進行調整。

具有字段分隔符 == 字段是一種不可能的。 您需要考慮對輸入數據的操作。

以下是一些固定寬度字段的示例:

$ awk '{gsub(" [[:space:]]{4} "," ---- ");print}' file1
1234 1234 abcd
1234 ---- abcd

您可以隨時恢復:

$ awk '{gsub(" [[:space:]]{4} "," ---- ");print}' file1 |awk '{gsub("----","    ");print}'
1234 1234 abcd
1234      abcd

對於非固定寬度的情況,您可以使用如下所示的內容,這會將超過兩個空格的序列轉換為其他內容:

$ awk '{gsub(" [[:space:]]{2,} "," - ");print}' file
1234 1234 abcd
1234 - abcd

我認為最簡單的方法是將字段分隔符聲明為 '\\t' (假設它確實是制表符分隔的)。

awk -F'\t' '{print $1,$2}' file_name

您的代碼現在應該可以正常工作了。

如果您的實際Input_file與所示示例相同,那么以下內容也可以幫助您。

awk '{sub(/ +[a-zA-Z]+/,"")} 1'   Input_file

暫無
暫無

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

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