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 列的新数据库。
最好是使用awk或sed命令的某种形式。
如果文件中的列分隔符是单个字符,例如空格,则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
对于单字符分隔符(例如空格或逗号),我建议cut在awk或 上使用命令sed。
但是,由于您特别询问awk,我认为一种合理的方法是减少字段计数:
awk -v last=676 '{NF = last} 1' datafile
Run Code Online (Sandbox Code Playgroud)
在 GNU Awk ( gawk) 和mawk.