如何输出带有certian列号(而不是字段值)的数据?

时间:2019-03-31 05:15:05

标签: bash

我正在用下面显示的各个列号分析我的研究数据。

....
FRAM_#         9100         2275(fs)  CN= 0 PRMRYTGT     13598      O    13600      H  0.962     13599      H  0.942
FRAM_#         9200         2300(fs)  CN= 0 PRMRYTGT     13598      O    13600      H  0.983     13599      H  0.977
FRAM_#         9300         2325(fs)  CN= 0 PRMRYTGT     13598      O    13600      H  1.022     13599      H  1.022
FRAM_#         9400         2350(fs)  CN= 0 PRMRYTGT     13598      O    13600      H  0.962     13599      H  0.926
FRAM_#         9500         2375(fs)  CN= 0 PRMRYTGT     13598      O    13600      H  0.985     13599      H  1.030      8279        CA  3.185
FRAM_#         9600         2400(fs)  CN= 0 PRMRYTGT     13598      O    13600      H  0.985     13599      H  0.949      8279        CA  3.149
FRAM_#         9700         2425(fs)  CN= 0 PRMRYTGT     13598      O    13600      H  0.984     13599      H  1.021      8279        CA  3.062
FRAM_#         9800         2450(fs)  CN= 0 PRMRYTGT     13598      O    13600      H  0.999     13599      H  1.017     
FRAM_#         9900         2475(fs)  CN= 0 PRMRYTGT     13598      O    13600      H  1.007     
....

每行的列号可能不同。每一列均被一个或多个空格分隔。我只想显示列号为14的那些数据,例如

....
    FRAM_#         9100         2275(fs)  CN= 0 PRMRYTGT     13598      O    13600      H  0.962     13599      H  0.942
    FRAM_#         9200         2300(fs)  CN= 0 PRMRYTGT     13598      O    13600      H  0.983     13599      H  0.977
    FRAM_#         9300         2325(fs)  CN= 0 PRMRYTGT     13598      O    13600      H  1.022     13599      H  1.022
    FRAM_#         9400         2350(fs)  CN= 0 PRMRYTGT     13598      O    13600      H  0.962     13599      H  0.926
    FRAM_#         9800         2450(fs)  CN= 0 PRMRYTGT     13598      O    13600      H  0.999     13599      H  1.017 
....

如何运行BASH脚本列出这些数据?

注意:我的数据有超过百万行。我需要考虑脚本的效率。任何进一步的帮助将不胜感激。

3 个答案:

答案 0 :(得分:0)

awk(或更好的gawk)专门处理诸如此类的任务,需要对列格式的数据进行操作。使用NF变量(awk的内置变量都是短大写字母的气动符号),您可以确定带有“数字字段”(NF)的行,并打印出来,例如。

awk 'NF == 14 { print }' ./dat.txt

注意awk是面向行的语言,因此这将在条件为真的行(在{ print }为真的情况下)执行块awk。您需要参考手册以获取详细信息,我只是awk用户,而不是专家。

答案 1 :(得分:0)

awk '{ if (NF == 14) { print } }' inp.txt >> ans.txt

答案 2 :(得分:0)

awk 'NF == 14'

如果未为给定模式指定任何命令,则Awk将使用默认命令{print $ 0}。