[英]Printing columns with two kinds of field separator awk
我想以以下方式打印以下文件:前六列始終由制表符分隔,其余(可以是兩列或更多列)始終由空格分隔。
對於示例文件:
1 1 0 0 1 0 2 2 1 1
1 2 0 0 2 0 2 2 1 1
1 3 1 2 1 0 2 2 1 1
1 4 1 2 2 0 2 2 1 1
1 5 1 2 1 0 2 2 1 1
1 6 1 2 1 0 2 2 1 1
1 7 1 2 2 0 2 2 1 1
我可以通過輸入以下內容來實現:
awk '{print $1"\t"$2"\t"$3"\t"$4"\t"$5"\t"$6"\t"$7" "$8" "$9" "$10}' file
但是,我不想說從第7列開始鍵入,而是要說其余的列,因為列數各不相同。
謝謝!
您可以使用for
遍歷字段。
{
for (i=1; i<=NF; i++) {
if (i<7) {
ORS="\t"
} else if (i != NF) {
ORS=" "
} else {
ORS="\n"
}
print $i
}
}
例
$ awk -f prog.awk file
1 1 0 0 1 0 2 2 1 1
1 2 0 0 2 0 2 2 1 1
1 3 1 2 1 0 2 2 1 1
1 4 1 2 2 0 2 2 1 1
1 5 1 2 1 0 2 2 1 1
1 6 1 2 1 0 2 2 1 1
1 7 1 2 2 0 2 2 1 1
{
r = $1 "\t" $2 "\t" $3 "\t" $4 "\t" $5 "\t" $6 "\t";
for (i=7; i<=NF; i++) {
r = r $i " ";
}
print substr(r,1,length(r)-1)
}
您的代碼適用於固定數量的字段。
NF變量包含當前記錄的字段總數。 因此,您可以在for循環中使用它來動態連接字段。
此外,循環的末尾還有一個剩余空間,可通過substr刪除。
這是真正的方法:
$ awk '{$1=$1; for(i=1;i<=6;i++) sub(/ /,"\t")}1' file
1 1 0 0 1 0 2 2 1 1
1 2 0 0 2 0 2 2 1 1
1 3 1 2 1 0 2 2 1 1
1 4 1 2 2 0 2 2 1 1
1 5 1 2 1 0 2 2 1 1
1 6 1 2 1 0 2 2 1 1
1 7 1 2 2 0 2 2 1 1
$1=$1
重新編譯當前記錄,用單個空白字符(OFS)替換所有連續空白(FS)序列, sub()
只是用制表符替換行中的第一個空白,然后循環重復該sub()
6次
與GNU sed
$ sed -r 's/ +/\t/g; s/\t/ /7g' file
1 1 0 0 1 0 2 2 1 1
1 2 0 0 2 0 2 2 1 1
1 3 1 2 1 0 2 2 1 1
1 4 1 2 2 0 2 2 1 1
1 5 1 2 1 0 2 2 1 1
1 6 1 2 1 0 2 2 1 1
1 7 1 2 2 0 2 2 1 1
首先將字段分隔符轉換為制表符,然后從7號到最后更改為空格。 如果字段已經用制表符分隔,則可以跳過第一條語句。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.