목록을 사용하여 큰 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개 필드만 유지하는 필드 에 전달합니다 .