我有一个数据库,其中包含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
我想要一个只有前676列的新数据库。
优选地,使用awk
或sed
命令的某种形式。
如果文件中的列定界符是单个字符(例如空格),则cut
可以轻松做到这一点:
cut -d' ' -f-676 <in >out
这仅打印从第一行到第676行之间用空格分隔的列。
如果您需要例如将每个空白字符都算作定界符,则sed
解决方案是:
sed -r 's/\s+\S+//677g' <in >out
这将替换第677位开始的所有列(=至少一个空格字符,然后至少一个非空格字符),不带任何内容。使用字符组,您可以指定所需的任何定界符集,例如“ 4”,“#”和“ K”:
sed -r 's/[4#K]+[^4#K]+//677g' <in >out
对于一种合理的 awk
方法,请参考steeldriver的答案,但这是另一个循环遍历各列,并且仅在列FS
数<= 676时才打印(用分隔):
awk '{for (i=1;i<=676;i++) {printf (i==1?"":FS)$i}; print ""}' <in >out
对于字符组,必须为输出指定输出字段分隔符,例如for[4#K]
和"sep"
:
awk -F'[4#K]' '{for (i=1;i<=676;i++) {printf (i==1?"":"sep")$i}; print ""}' <in >out
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句