リストを使用して大きなTSVテーブルから特定の項目を抽出しようとしています。また、最初の5列に対応するデータが必要です。
リストファイル.txt
アイテム123
アイテム532
アイテム685
アイテム555
...など...
テーブル.tsv
列1 | 2列 | 3列 | 4列 | 5列 | 6列 | 7列 | 8列 | 9列 | 列10 | など... |
---|---|---|---|---|---|---|---|---|---|---|
値1 | 値2 | 値3 | 値4 | 値5 | アイテム787 | 値7 | 値7 | 値7 | 値7 | など... |
値1 | 値2 | 値3 | 値4 | 値5 | 値6 | アイテム532 | 値7 | 値7 | 値7 | など... |
値1 | 値2 | 値3 | 値4 | 値5 | 値6 | アイテム 685 | 値7 | 値7 | 値7 | など... |
値1 | 値2 | 値3 | 値4 | 値5 | アイテム999 | 値7 | 値7 | 値7 | 値7 | など... |
値1 | 値2 | 値3 | 値4 | 値5 | 値6 | 値7 | アイテム123 | 値7 | 値7 | など... |
値1 | 値2 | 値3 | 値4 | 値5 | 値6 | 値7 | 値7 | 値7 | アイテム 555 | など... |
など... | など... | など... | など... | など... | など... | など... | など... | など... | など... | など... |
出力
列1 | 2列 | 3列 | 4列 | 5列 | 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つのフィールドのみを保持するフィールドに渡します。