我正在尝试使用以下代码从文件的所有行中删除第26行以外的列:
awk '{ FS = ";" ; for(i=1;i<NF;i++) if (i<26) printf $i FS}{print $26}'
它在所有行中都运行良好,但是对于第一行,它显示了另外两个字段(并将最后一个字段切成两个)。
我的代码有什么问题吗?
非常感谢
答案 0 :(得分:3)
这是因为你在每一行设置FS
,而它应该在BEGIN{}
块中(或作为参数在外面,就像其他答案正确建议一样):
awk 'BEGIN{FS=";"} {for(i=1;i<NF;i++) if (i<26) printf $i FS}{print $26}' file
事实上,为了实现目标,使用cut
更容易:
cut -d';' -f-26 file
^ ^^^
| all fields up to the 26th
delimiter
示例文件:
$ cat a
1col1;col2;col3;col4;col5;col6
2col1;col2;col3;col4;col5;col6
3col1;col2;col3;col4;col5;col6
上一个代码:
$ awk '{FS=";"; for(i=1;i<NF;i++) if (i<4) printf $i FS}{print $4}' a
2col1;col2;col3;col4
3col1;col2;col3;col4
新代码:
$ awk 'BEGIN{FS=";"} {for(i=1;i<NF;i++) if (i<4) printf $i FS}{print $4}' a
1col1;col2;col3;col4
2col1;col2;col3;col4
3col1;col2;col3;col4
cut
:
$ cut -d';' -f-4 a
1col1;col2;col3;col4
2col1;col2;col3;col4
3col1;col2;col3;col4
答案 1 :(得分:3)
您可以尝试此awk
,
awk -F';' 'NF>26{NF=26}1' OFS=';' yourfile
答案 2 :(得分:0)
@fedorqui是对的。
但您也可以使用它来设置字段分隔符:
awk -F";" '{for(i=1;i<NF;i++) if (i<26) printf $i FS}{print $26}' file