첫 번째 파일의 열 번호가 두 번째 파일의 열 번호와 일치하는 열만 유지합니다.

첫 번째 파일의 열 번호가 두 번째 파일의 열 번호와 일치하는 열만 유지합니다.

나는유전자형.파일317개의 열(1, 2, 3, ..., 317)이 있습니다. 아래 예에서는 처음 몇 개의 열만 표시하고 있습니다!

입력하다 genotype.file:

Chr00c0002  56240   N   N   N   A   N   A   N   N   N   N   N   A   
Chr00c0040  55087   N   N   N   C   N   N   N   N   N   N   N   N   
Chr00c0041  24730   N   N   N   A   N   A   N   N   N   N   N   N   
...

나는 단지 그것들을 각각의 count.files.

cat count.file.1
51
92
166
169
196
199
213
228
229
284
291
297

그래서 첫 번째로는카운트 파일51, 92, 166, 169열만 유지하고 싶습니다.유전자형.파일.

답변1

genotype.file파일이 탭으로 구분되어 있다고 가정합니다 .

cut -f $(tr '\n' ',' <count.file.1 | sed 's/,$//') genotype.file

명령 대체는 입력 파일에서 잘라낼 $( tr ... | sed ... )쉼표로 구분된 열 번호 목록을 생성합니다.cut

파일 tr의 모든 개행 문자를 쉼표로 바꾸고 끝에 있는 추가 쉼표를 제거합니다 count.file.1.sed

샘플 데이터를 기반으로 생성된 명령은 다음과 같습니다.

cut -f 51,92,166,169,196,199,213,228,229,284,291,297 genotype.file

파일을 반복합니다 count.file.*.

for cfile in count.file.*; do
    cut -f $(tr '\n' ',' <"$cfile" | sed 's/,$//') genotype.file >genotype-"${cfile##*.}"
done

그러면 이라는 새 파일이 생성됩니다. 여기서 는 genotype-N파일을 생성하는 데 사용된 파일에 N해당하는 번호 입니다. 파일 이름 끝부분에서 번호가 추출됩니다.count.file.Ngenotype.file


genotype.file경우아니요탭으로 구분된 경우 탭으로 구분되도록 설정할 수 있습니다.

tr -s ' ' '\t' <genotype.file >genotype.tsv

이는 원본 파일의 열이 공백으로만 구분되어 있다고 가정합니다. 이 tr명령은 여러 개의 연속 공백을 탭 문자로 바꿉니다. 결과는 새 파일로 리디렉션됩니다. cut이 새 파일에 대해 위 명령을 사용할 수 있습니다 .


사용awk

awk 'NR == FNR { c[++n] = $0; next } { t=$c[1]; for (i=2; i<=n; ++i) t = t OFS $c[i]; print t }' count.file.1 genotype.file

이는 먼저 배열로 count.file.1추출하려는 열을 읽은 다음 읽을 때 이 열 번호를 사용하여 데이터를 추출합니다. 선택한 열에서 생성된 출력 행을 보유하는 임시 변수입니다.genotype.filecgenotype.filet

파일을 반복합니다 count.file.*.

for cfile in count.file.*; do
    awk 'NR == FNR { c[++n] = $0; next } { t=$c[1]; for (i=2; i<=n; ++i) t = t OFS $c[i]; print t }' \
        "$cfile" genotype.file >genotype-"${cfile##*.}"
done

그러면 솔루션 genotype-N과 동일한 방식 으로 호출되는 새 파일이 생성됩니다 .cut

답변2

awk간단한 스크립트에만 사용됩니다.

awk '{ printf "{ print ";for(i=1; i<NF; i++){ printf "$%d, ",$i};
       print "$"$i" }" }' <<< "$(awk '{printf $0" "}' count.file.{1..50})" >genotype.awk

그러면 모든 파일에서 모든 열 번호를 awk수집하는 아래와 같은 스크립트가 생성됩니다 . 우리는 사용했었다genotype.awkcount.file.{1..50}Brace Expansion여기에서 50개 파일을 모두 읽어보세요 awk.

{ print $51, $92, $166, $169, $196, $199, $213, $228, $229, $284, $291, $297, ... }

용법:

awk -f genotype.awk genotype.file

그러면 파일에서 genotype.awk스크립트가 실행 genotype.file되고 포함된 열 번호만 인쇄됩니다.

관련 정보