簡體   English   中英

使用兩種字段分隔符awk打印列

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

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