각 파일의 처음 두 열을 사용하여 fil2, file3 및 file4의 추가 열을 적절한 행(처음 두 열이 일치하는 위치)에서 file1에 추가하고 싶습니다. File2에는 file1에 추가할 세 개의 열이 있지만 다른 모든 파일에는 추가할 열이 하나만 있습니다(마지막 열).
항목은 NW_456 44
file3 NW_987 75
에 주석 처리되어 있지 않으므로 손실됩니다. 해당 특정 열에 대한 출력 파일을 비워두고 싶습니다(실제로는 "비어 있음"이라고 표시되지 않음).
예:
파일 1
NW_1234 23
NW_1234 29
NW_1234 778
NW_456 44
NW_987 75
NW_987 98
NW_5000 105
NW_5500 37
NW_5500 900
파일 2
NW_1234 23 C 0:0:32:0:0:0 42:0:0:0:0:0
NW_1234 29 C 0:0:28:0:0:0 0:28:0:0:0:0
NW_1234 778 C 0:54:0:0:0:0 0:0:53:0:0:0
NW_456 44 G 0:0:0:45:0:0 59:0:0:0:0:0
NW_987 75 G 0:0:0:60:0:0 55:0:0:0:0:0
NW_987 98 C 0:0:63:0:0:0 0:42:0:0:0:0
NW_5000 105 G 0:0:71:0:0:0 0:50:0:0:0:0
NW_5500 37 G 0:0:0:54:0:0 55:0:0:0:0:0
NW_5500 900 A 43:0:0:0:0:0 0:0:0:37:0:0
파일 3
NW_1234 23 DOCK
NW_1234 29 DOCK
NW_1234 778 DOCK
NW_987 98 TFEC
NW_5000 105 MIN
NW_5500 37 LIPG
NW_5500 900 MYC
파일 4
NW_1234 23 intron_region
NW_1234 29 intron_region
NW_1234 778 intron_region
NW_456 44 intergenic
NW_987 75 intergenic
NW_987 98 intron_region
NW_5000 105 intron_region
NW_5500 37 intron_region
NW_5500 900 intron_region
결과물 파일
NW_1234 23 C 0:0:32:0:0:0 42:0:0:0:0:0 DOCK intron_region
NW_1234 29 C 0:0:28:0:0:0 0:28:0:0:0:0 DOCK intron_region
NW_1234 778 C 0:54:0:0:0:0 0:0:53:0:0:0 DOCK intron_region
NW_456 44 G 0:0:0:45:0:0 59:0:0:0:0:0 (empty) intergenic
NW_987 75 G 0:0:0:60:0:0 55:0:0:0:0:0 (empty) intergenic
NW_987 98 C 0:0:63:0:0:0 0:42:0:0:0:0 TFEC intron_region
NW_5000 105 G 0:0:71:0:0:0 0:50:0:0:0:0 MIN intron_region
NW_5500 37 G 0:0:0:54:0:0 55:0:0:0:0:0 LIPG intron_region
NW_5500 900 A 43:0:0:0:0:0 0:0:0:37:0:0 MYC intron_region
이 질문과 유사합니다:두 번째 열의 일치를 기반으로 열 추가
도움을 주시면 감사하겠습니다!
답변1
탭을 출력 필드 구분 기호로 사용하면 모든 UNIX 시스템의 모든 쉘에 있는 모든 awk에서 작동합니다.
$ cat tst.awk
BEGIN { OFS="\t"; }
FNR==1 { fileNr++ }
{
key = $1 OFS $2
if (NR == FNR) {
keys[++numKeys] = key
}
else {
sub(/([^[:space:]]+[[:space:]]+){2}/,"")
$1 = $1
vals[key,fileNr] = $0
}
}
END {
for (keyNr=1; keyNr<=numKeys; keyNr++) {
key = keys[keyNr]
printf "%s", key
for (fileNr=2; fileNr<ARGC; fileNr++) {
printf "%s%s", OFS, vals[key,fileNr]
}
print ""
}
}
.
$ awk -f tst.awk file1 file2 file3 file4
NW_1234 23 C 0:0:32:0:0:0 42:0:0:0:0:0 DOCK intron_region
NW_1234 29 C 0:0:28:0:0:0 0:28:0:0:0:0 DOCK intron_region
NW_1234 778 C 0:54:0:0:0:0 0:0:53:0:0:0 DOCK intron_region
NW_456 44 G 0:0:0:45:0:0 59:0:0:0:0:0 intergenic
NW_987 75 G 0:0:0:60:0:0 55:0:0:0:0:0 intergenic
NW_987 98 C 0:0:63:0:0:0 0:42:0:0:0:0 TFEC intron_region
NW_5000 105 G 0:0:71:0:0:0 0:50:0:0:0:0 MIN intron_region
NW_5500 37 G 0:0:0:54:0:0 55:0:0:0:0:0 LIPG intron_region
NW_5500 900 A 43:0:0:0:0:0 0:0:0:37:0:0 MYC intron_region
공백을 공백으로 변경하려면(추가 도구 구문 분석에 덜 유용함) 다음으로 파이프하면 됩니다 column
.
$ awk -f tst.awk file1 file2 file3 file4 | column -s$'\t' -t
NW_1234 23 C 0:0:32:0:0:0 42:0:0:0:0:0 DOCK intron_region
NW_1234 29 C 0:0:28:0:0:0 0:28:0:0:0:0 DOCK intron_region
NW_1234 778 C 0:54:0:0:0:0 0:0:53:0:0:0 DOCK intron_region
NW_456 44 G 0:0:0:45:0:0 59:0:0:0:0:0 intergenic
NW_987 75 G 0:0:0:60:0:0 55:0:0:0:0:0 intergenic
NW_987 98 C 0:0:63:0:0:0 0:42:0:0:0:0 TFEC intron_region
NW_5000 105 G 0:0:71:0:0:0 0:50:0:0:0:0 MIN intron_region
NW_5500 37 G 0:0:0:54:0:0 55:0:0:0:0:0 LIPG intron_region
NW_5500 900 A 43:0:0:0:0:0 0:0:0:37:0:0 MYC intron_region