두 개 이상의 파일이 있습니다.
파일 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 }'.
두 파일이 모두 동일한 열로 정렬되어 있는지 확인하세요.