[英]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.