2016-12-13 88 views
0

我想打印下列文件,其中前六列總是由製表符分隔,其餘(可以是兩個或更多)始終以空格分隔。使用兩種字段分隔符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欄打字,我想說的列的其餘部分的數的列不盡相同。

謝謝!

回答

0

您可以使用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 
0
{ 
    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刪除。

+0

雖然此代碼片段可能會解決問題,但[包括解釋](// meta.stackexchange.com/questions/114762/explaining-entirely-code-based-answers)確實有助於提高帖子的質量。請記住,您將來會爲讀者回答問題,而這些人可能不知道您的代碼建議的原因。也請儘量不要用解釋性註釋來擠佔代碼,這會降低代碼和解釋的可讀性! – kayess

0

這是如何真正做到這一點:

$ 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重新編譯當前記錄替換的連續空白(FS)使用單個空格字符(OFS)所有序列中,sub()只是替換了第一個空白在一個標籤的行上,並且該循環重複6次,即sub()

0

與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日結束更改。如果這些字段已經制表符分隔,則可以跳過第一條語句。