我有一张大桌子。我想保留前四列,但之后只打印每一列。
我试过
awk -v OFS="\t" '{
for(i=1;i<=NF;i++){
if(i<=4)
print $0
else if(i>4 && (i%4)==0)
print $i
}
}'
答案 0 :(得分:3)
试试这个:
hzhang@dell-work ~ $ 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
hzhang@dell-work ~ $ 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
}
hzhang@dell-work ~ $ 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
我使用逗号作为字段分隔符,如果你的字段分隔符是空格,只需删除BEGIN子句中的FS。
答案 1 :(得分: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
只需将BEGIN部分中FS和OFS的设置更改为您的实际输入和所需的输出字段分隔符。
答案 2 :(得分: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