명령을 붙여넣어 출력 파일 형식 지정

명령을 붙여넣어 출력 파일 형식 지정

두 개 이상의 파일이 있습니다.

파일 A

A: 18.49 RPKM    
C: 14.49 RPKM    
B: 18.89 RPKM

문서 B

A: 21.29 RPKM    
C: 38.71 RPKM    
B: 36.13 RPKM

이 두 파일을 붙여넣고 첫 번째 열만 한 번 인쇄하고 각 파일의 두 번째 열을 인쇄하고 싶습니다.

원하는 출력(탭으로 구분)

A:  18.49   21.29   
C:  14.49   38.71   
B:  18.89   36.13

붙여넣기 명령을 사용했습니다.

paste FileA FileB | awk '{ { print $1} {ORS="\t"} for (i=2; i<=NF; i+=3) { print $i } {print "\n"} }'

나는이 출력을 얻습니다

ㅏ:

18.49 21.29

중간: 14.49 38.71

B: 18.89 36.13

이 문제를 해결하는 방법을 제안해 주실 수 있나요? 감사해요! !

답변1

모든 UNIX 시스템의 모든 쉘에 있는 awk의 경우, 입력 파일 수에 관계없이 필요한 것은 다음과 같습니다.

$ paste FileA FileB | awk '{o=$1; for (i=2; i<NF; i+=3) o=o"\t"$i; print o}'
A:      18.49   21.29
C:      14.49   38.71
B:      18.89   36.13

답변2

ORS출력은기록구분 기호(일반적으로 개행 문자)입니다. 이것이 {print $1}첫 번째 줄 다음에 개행 문자가 있는 이유입니다. 일반적으로 OFS필드를 구분하는 출력 필드 구분 기호를 설정해야 합니다 .

각 필드를 선택적으로 인쇄하는 대신(열 5(두 번째 파일의 두 번째 열)가 열 3이 되고, 열 8(세 번째 파일의 두 번째 열)에 필요한 필드를 시작 열 2로 이동할 수 있음)이 열 4가 되고, 그런 다음 NF나머지 불필요한 열을 삭제할 수 있습니다.

BEGIN { OFS = "\t" }
{
  nfiles = NF / 3;  # get number of files
  for (i = 2; i <= nfiles; i++)  # second column is already OK, start from 3
    $(i+1) = $(3*i - 1);   # Assign 2nd column of file no. i to column no. i + 1
  NF = nfiles + 1 # set NF to delete remaining columns
}
1  # print lines

FileC예를 들어 B FileD와 A 의 복사본이 있습니다 .

~ paste File* | awk -v OFS='\t' '{nfiles = NF / 3; for (i = 2; i <= nfiles; i++) $(i+1) = $(3*i - 1); NF = nfiles + 1} 1'
A:  18.49   21.29   21.29   18.49
C:  14.49   38.71   38.71   14.49
B:  18.89   36.13   36.13   18.89

답변3

join fileA fileB |awk '{ print $1"\t"$2"\t"$3 }'. 

두 파일이 모두 동일한 열로 정렬되어 있는지 확인하세요.

관련 정보