我有一張大桌子。我想保留前四列,但之後只打印第四列。打印前四列但之後每列第四列
我試圖
awk -v OFS="\t" '{
for(i=1;i<=NF;i++){
if(i<=4)
print $0
else if(i>4 && (i%4)==0)
print $i
}
}'
我有一張大桌子。我想保留前四列,但之後只打印第四列。打印前四列但之後每列第四列
我試圖
awk -v OFS="\t" '{
for(i=1;i<=NF;i++){
if(i<=4)
print $0
else if(i>4 && (i%4)==0)
print $i
}
}'
試試這個:
[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子句。
借款@ 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的設置中的開始部分是你的實際輸入和所需的輸出字段分隔符。
爲了避免腳本嘗試多的測試:
awk -F, '{
printf "%s\t%s\t%s",$1,$2,$3
for(i=4;i<=NF;i+=4)
printf "\t%s",$i
print ""
}' file
改變'$打印到0''$打印i'? – haifzhan
工作,但在一列中水平打印所有內容! –
列是垂直的。行是水平的。你要哪個?發佈一些示例輸入和預期輸出總是非常有用。 –