使用 awk 或 sed 删除多列

and*_*rec 4 sed awk text-processing

我有一个包含 6037 个空格分隔列和 450 行的数据库,如下所示:

1807 1452 1598 1 6.655713  A B A B ... 0 
1808 1452 1763 1 9.362033  0 0 A B ... A 
1809 1452 1527 2 6.728534  A B A A ... B 
1810 1452 1367 2 9.4055  A B A A B ... A 
... ... ... ... ... ... ... ... ... ...
1812 1452 1258 1 6.363032  0 0 A B ... B
Run Code Online (Sandbox Code Playgroud)

我想获得一个只有前 676 列的新数据库。

最好是使用awksed命令的某种形式。

des*_*ert 8

如果文件中的列分隔符是单个字符,例如空格,则cut可以轻松做到:

cut -d' ' -f-676 <in >out
Run Code Online (Sandbox Code Playgroud)

这仅打印从第一个到第 676 个以空格分隔的列。

如果您需要例如每个空格字符都算作分隔符,则sed解决方案是:

sed -r 's/\s+\S+//677g' <in >out
Run Code Online (Sandbox Code Playgroud)

这将替换从第 677 个开始的每一列(= 至少一个空白字符后跟至少一个非空白字符)。使用字符组,您可以指定所需的任何定界符集,例如“4”、“#”和“K”:

sed -r 's/[4#K]+[^4#K]+//677g' <in >out
Run Code Online (Sandbox Code Playgroud)

对于合理的 awk方法,请参阅steeldriver 的回答,但这里是另一个循环列,并且仅FS在它们的编号 <= 676时才打印它们(以 分隔):

awk '{for (i=1;i<=676;i++) {printf (i==1?"":FS)$i}; print ""}' <in >out
Run Code Online (Sandbox Code Playgroud)

对于字符组,您必须为输出指定输出字段分隔符,例如 for[4#K]"sep"

awk -F'[4#K]' '{for (i=1;i<=676;i++) {printf (i==1?"":"sep")$i}; print ""}' <in >out


ste*_*ver 5

对于单字符分隔符(例如空格或逗号),我建议cutawk或 上使用命令sed

但是,由于您特别询问awk,我认为一种合理的方法是减少字段计数:

awk -v last=676 '{NF = last} 1' datafile
Run Code Online (Sandbox Code Playgroud)

在 GNU Awk ( gawk) 和mawk.