각 파일의 특정 열을 선택하고 새 파일에 붙여넣습니다.

각 파일의 특정 열을 선택하고 새 파일에 붙여넣습니다.

동일한 줄 수의 탭으로 구분된 파일이 20개 있습니다. 각 파일의 네 번째 열을 모두 선택하고 싶습니다.붙여넣은새 파일에 함께 추가됩니다. 마지막으로 새 파일에는 20개의 열이 있으며 각 열은 20개의 서로 다른 파일에서 나옵니다.

Unix/Linux 명령을 사용하여 이 작업을 어떻게 수행합니까?

20개의 동일한 형식을 입력하세요. 여기서는 파일 1의 네 번째 열을 A1로 표시하고 싶습니다.

chr1    1734966 1735009 A1       0       0       0       0       0       1       0
chr1    2074087 2083457 A1       0       1       0       0       0       0       0
chr1    2788495 2788535 A1       0       0       0       0       0       0       0
chr1    2821745 2822495 A1       0       0       0       0       0       1       0
chr1    2821939 2822679 A1       1       0       0       0       0       0       0
...

20개 열이 있는 출력 파일. 각 열은 20개 파일의 4번째 열 중 하나에서 나옵니다.

A1       A2       A3       ...       A20
A1       A2       A3       ...       A20
A1       A2       A3       ...       A20
A1       A2       A3       ...       A20
A1       A2       A3       ...       A20
...

답변1

Bash 에서는 paste다음과 같이 할 수 있습니다:

paste <(cut -f 4 1.txt) <(cut -f 4 2.txt) .... <(cut -f 4 20.txt)

Python 스크립트와 원하는 수의 파일( python scriptname.py column_nr file1 file2 ... filen)을 사용합니다.

#! /usr/bin/env python

# invoke with column nr to extract as first parameter followed by
# filenames. The files should all have the same number of rows

import sys

col = int(sys.argv[1])
res = {}

for file_name in sys.argv[2:]:
    for line_nr, line in enumerate(open(file_name)):
        res.setdefault(line_nr, []).append(line.strip().split('\t')[col-1])

for line_nr in sorted(res):
    print '\t'.join(res[line_nr])

답변2

다음 스크립트는 이를 수행하기 위해 awk를 사용합니다. 편의상 파일의 줄 수(r)를 나타내는 줄 번호를 추가했습니다. 붙여넣으려는 열 수는 c로 표시됩니다.

directory=/your-directory/
r=4
c=20

for n in $(seq 1 $r); do
echo "$n" >> rownumber.txt
done

for n in $(seq 1 $c); do
awk '{ print $4}' /$directory/file-$n.txt > /$directory/output-$n.txt
done

paste /$directory/rownumber.txt /$directory/output-[1-$c]*.txt > /$directory/newfile.txt

관련 정보