각 파일에서 동일한 열을 하나의 파일로 추출

Aug 21 2020

171 개의 파일이있는 다음 데이터 세트가 있습니다.

CHR:POS   REF:ALT   BREED

6:85406127 T:A 0.333333
6:85406128 T:C 0
6:85406129 C:G 0.333333
6:85406130 T:G 0.833333

원하는 출력은

CHR:POS   REF:ALT   BREED BREED2 BREED3 ... 171st file

6:85406127 T:A 0.333333 0.33 0.5 .... 0.4
6:85406128 T:C NA 0.33 0.5 .... 0.4
6:85406129 C:G 0.333333 0.33 NA .... 0
6:85406130 T:G 0.833333 0.33 0.5 .... NA

파일 이름에는 품종 이름이 포함됩니다. 첫 번째 및 두 번째 열은 모든 파일에 동일한 정보를 포함합니다. 첫 번째 파일의 모든 열을 유지하면서 각 파일에서 세 번째 열만 추출하려면 어떻게해야합니까?

추출에서 제외하기 위해 첫 번째 파일을 다른 폴더로 옮겼습니다. 다음 명령은 결과를 제공하지 않았습니다.

cut -d " " -f3 *.txt | paste ../breedname.txt - > output.txt

이 질문에 표시된 awk 명령을 사용하려고 시도했지만 내 데이터 세트에서 작동하지 않았습니다.

  • 여러 파일의 동일한 열을 하나로 붙여 넣기
  • 파일의 n 번째 열마다 인쇄

모든 도움을 환영합니다!

답변

kvantour Aug 21 2020 at 21:13

다음은 매우 빠르고 더러운 방법입니다.

파일이 동일한 순서라고 가정합니다.

$ awk '(FNR==NR){a[FNR]=$0;next}
       {a[FNR]=a[FNR] FS $NF}
       END{for(i=1;i<=FNR;++i) print a[i]}' file1 file2 file3 ... filen

헤더를 좀 더 깔끔하게 만들고 싶다면 :

$ awk '(FNR==NR){a[FNR]=$0 (FNR==1?++c:"");next} {a[FNR]=a[FNR] FS $NF (FNR==1?++c:"")}
       END{for(i=1;i<=FNR;++i) print a[i]}' file1 file2 file3 ... filen

파일이 같은 순서가 아니라고 가정합니다.

$ awk '{key=$1 FS $2} (FNR==NR){a[key]=$0 (FNR==1?++c:"");next}
       {a[key]=a[key] FS $NF (FNR==1?++c:"")}
       END{for(i in a) print a[i]}' file1 file2 file3 ... filen
kupsef Aug 21 2020 at 21:40

나는 다음과 같이 할 것입니다.

paste -d " " *.txt | awk '{printf "%s %s ",$1,$2; for (i = 3; i <= NF; i+=3){printf "%s ",$i} print ""}'

paste선을 수직으로 결합하므로 모든 열이 나란히 있습니다. 그 후에 필요한 열을 선택하기 만하면됩니다.