我正在尝试使用列表从大型 tsv 表中提取一些特定条目。我还需要前 5 列中的相应数据。
列表文件.txt
条目123
条目532
条目685
条目555
...ETC...
表.tsv
第 1 列 | 列2 | 第 3 列 | 第 4 列 | col5 | 第 6 栏 | 7 号栏 | 8 号栏 | 第 9 栏 | 第 10 栏 | ETC... |
---|---|---|---|---|---|---|---|---|---|---|
值1 | 值2 | 值3 | 值4 | 值5 | 条目787 | 值7 | 值7 | 值7 | 值7 | ETC... |
值1 | 值2 | 值3 | 值4 | 值5 | 值6 | 条目532 | 值7 | 值7 | 值7 | ETC... |
值1 | 值2 | 值3 | 值4 | 值5 | 值6 | 条目685 | 值7 | 值7 | 值7 | ETC... |
值1 | 值2 | 值3 | 值4 | 值5 | 条目999 | 值7 | 值7 | 值7 | 值7 | ETC... |
值1 | 值2 | 值3 | 值4 | 值5 | 值6 | 值7 | 条目123 | 值7 | 值7 | ETC... |
值1 | 值2 | 值3 | 值4 | 值5 | 值6 | 值7 | 值7 | 值7 | 条目555 | ETC... |
ETC... | ETC... | ETC... | ETC... | ETC... | ETC... | ETC... | ETC... | ETC... | ETC... | ETC... |
输出
第 1 列 | 列2 | 第 3 列 | 第 4 列 | col5 | 第 6 栏 |
---|---|---|---|---|---|
条目123 | 值1 | 值2 | 值3 | 值4 | 值5 |
条目532 | 值1 | 值2 | 值3 | 值4 | 值5 |
条目685 | 值1 | 值2 | 值3 | 值4 | 值5 |
条目555 | 值1 | 值2 | 值3 | 值4 | 值5 |
我尝试过这个组合但不起作用。
grep -o -F -f listfile.txt table.tsv | awk '{print $1"\t"$2"\t"$3"\t"$4"\t"$5}' > output
我究竟做错了什么?多谢。
答案1
假设一个制表符分隔的文件如下所示,任何字段中都没有空格:
$ cat file
col1 col2 col3 col4 col5 col6 col7 col8 col9 col10 etc...
val1 val2 val3 val4 val5 entry123 val7 val7 val7 val7 etc...
val1 val2 val3 val4 val5 val6 entry532 val7 val7 val7 etc...
val1 val2 val3 val4 val5 val6 entry685 val7 val7 val7 etc...
val1 val2 val3 val4 val5 entry999 val7 val7 val7 val7 etc...
val1 val2 val3 val4 val5 val6 val7 val7 val7 entry555 etc...
和一个如下所示的列表文件:
$ cat listfile
entry123
entry532
entry685
entry555
grep
您可以使用和的组合来做您想做的事cut
:
$ grep -wf listfile -e 'col1' file | cut -f1-6
col1 col2 col3 col4 col5 col6
val1 val2 val3 val4 val5 entry123
val1 val2 val3 val4 val5 val6
val1 val2 val3 val4 val5 val6
val1 val2 val3 val4 val5 val6
首先,grep -wf listfile -e 'col1' file
将打印包含以下单词之一的所有行listfile
作为一个单独的词,所以只要您的字段中没有空格,就意味着作为一个单独的字段。它还会打印标题,因为它是唯一匹配col1
为单独单词的行。您需要对真实数据使用不同的单词,选择仅在标题中找到的内容。
接下来,将其传递给cut -f1-6
仅保留前 6 个字段的字段。