2015-04-17 68 views
3

我有一張大桌子。我想保留前四列,但之後只打印第四列。打印前四列但之後每列第四列

我試圖

awk -v OFS="\t" '{ 
        for(i=1;i<=NF;i++){ 
         if(i<=4) 
          print $0 
         else if(i>4 && (i%4)==0) 
          print $i 
        } 
}' 
+1

改變'$打印到0''$打印i'? – haifzhan

+0

工作,但在一列中水平打印所有內容! –

+0

列是垂直的。行是水平的。你要哪個?發佈一些示例輸入和預期輸出總是非常有用。 –

回答

3

試試這個:

[email protected] ~ $ cat sample.csv 
1,2,3,4,5,6,7,8,9,10,11,12,13 
1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17 
1,2,3,4,5,6,7,8,9,10,11,12,13 
[email protected] ~ $ cat test.awk 
BEGIN{ 
FS=","; 
OFS="\t" 
} 
{ 
    str = ""; 
    counter = 0; 
    for(i=1; i<=NF; i++){ 
     if(i <= 3 || i % 4 == 0){ 
      counter += 1 
      if(counter < 3 + NF/4 - 1){ 
       str = str $i OFS 
      }else{ 
       str = str $i 
      } 
     } 
    }; 
    print str 
} 
[email protected] ~ $ awk -f test.awk sample.csv 
1 2 3 4 8 12 
1 2 3 4 8 12 16 
1 2 3 4 8 12 

我使用逗號作爲字段分隔符,如果你的字段分隔符是空白,只是刪除FS,在BEGIN子句。

+0

我會'if(i <= 4 || i%4 == 0)',它有點短,可以跳過'else'子句。 –

+0

@Llama先生,這更清晰!我更新了它。 – haifzhan

+0

考慮這個「缺陷」 - 你可以計算出最後一個字段,用'final_fld = NF-(NF%4)'來打印,然後用它來封閉循環,並且用三元運算符構造'str'決定何時追加'OFS'。 – n0741337

0

借款@ haifzhan的輸入文件,並使用在輸出;!而非標籤,所以你可以看到那裏的OFS的發生:

$ cat file 
1,2,3,4,5,6,7,8,9,10,11,12,13 
1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17 
1,2,3,4,5,6,7,8,9,10,11,12,13 

$ cat tst.awk 
BEGIN { FS=","; OFS=";" } 
{ 
    for (i=1;i<=NF;i++) { 
     if (i<5 || !(i%4)) { 
      printf "%s%s", (i>1?OFS:""), $i 
     } 
    } 
    print "" 
} 

$ awk -f tst.awk file 
1;2;3;4;8;12 
1;2;3;4;8;12;16 
1;2;3;4;8;12 

只要改變FS和OFS的設置中的開始部分是你的實際輸入和所需的輸出字段分隔符。

0

爲了避免腳本嘗試多的測試:

awk -F, '{ 
printf "%s\t%s\t%s",$1,$2,$3 
for(i=4;i<=NF;i+=4) 
    printf "\t%s",$i 
print "" 
      }' file