다음과 같은 4개의 tsv(탭으로 구분된) 파일이 있습니다.
file_1:
abc 1
def 2
ghi 3
파일_2:
abc 2
ghi 3
파일_3:
def 1
ghi 2
jkl 4
파일_4:
ghi 3
jkl 4
해당 파일을 결합하여 다음과 같은 1개의 tsv 파일을 얻고 싶습니다.
dataset file_1 file_2 file_3 file_4
abc 1 2
def 2 4
ghi 3 3 2 3
jkl 4 4
나는 사용해 보았다awk
$ awk '
BEGIN{OFS=FS="\t"}
FNR==1{f = f "\t" FILENAME}
NR==FNR{a[$1] = $2}
NR!=FNR{a[$1] = a[$1] "\t" $2}
END{printf "dataset%s\n", f; for(i in a) print i, a[i]}
' file_{1..4}
이 명령은 작동하지만 값이 변경되었습니다. 첫 번째와 두 번째 열의 값이 비어 있고 세 번째와 네 번째 열의 값이 4와 4인 경우 해당 명령에서 얻은 출력은 첫 번째와 두 번째 열의 값이 4이지만 세 번째와 네 번째 열의 값은 비어 있습니다. 그래서 제가 언급한 것을 사용하여 tsv 파일을 별도로 결합하려고 합니다 awk
. 먼저 에 대해서만 을 file_1
얻고 file_2
, output_1
다음에는 가입 하여 file_3
을 file_4
얻습니다 output_2
. 그 후에는output_1과output_2을 병합하는 데 사용 $ join output_1 output_2
하지만 4개 파일에 존재하는 값만 얻습니다. 하나의 파일에만 존재하는 데이터를 잃어버렸습니다.
조언을 주시면 정말 감사하겠습니다.
감사합니다
답변1
$ cat tst.awk
BEGIN { FS=OFS="\t" }
{ datasets[$1]; fnames[FILENAME]; vals[$1,FILENAME] = $2 }
END {
printf "%s", "dataset"
for (fname in fnames) {
printf "%s%s", OFS, fname
}
print ""
for (dataset in datasets) {
printf "%s", dataset
for (fname in fnames) {
printf "%s%s", OFS, vals[dataset,fname]
}
print ""
}
}
$ tail -n +1 file?
==> file1 <==
a 1
b 2
c 3
==> file2 <==
a 2
c 3
$ awk -f tst.awk file1 file2
dataset file1 file2
a 1 2
b 2
c 3 3
원하는 만큼 목록에 파일을 추가하세요.
답변2
join (GNU coreutils) 8.30
"프로세스 대체"를 사용하여 시도해 볼 수 있습니다.
join -a1 -a2 -t" " -oauto -e " " <(join -a1 -a2 -t" " -oauto -e "" file[12]) <(join -a1 -a2 -t" " -oauto -e " " file[34])
abc 1 2
def 2 1
ghi 3 3 2 3
jkl 4 4
옵션 에는 문자 값이 -t
있습니다 <TAB>
.
답변3
지금은 조언: 필요할 경우 나중에 코드를 작성하세요.
모든 파일을 읽으면서 세 개의 배열을 유지하겠습니다.
(a) 각각의 새 파일에 대해 파일 이름의 해시 목록.
(b) 각각의 새로운 데이터 세트에 대해 $1의 해시 목록.
(c) 각 행에 대해 값의 해시 목록
FNR == 1 { ++htFile[FILENAME]; }
! ($1 in htSet) { ++htSet[$1]; }
{ htVal [FILENAME, $1] = $2; }
End 함수에서 htFile 및 htSet을 반복합니다.
function Table (r, c, buf) {
buf = "dataset";
for (c in htFile)
buf = sprint ("%s\t%s", buf, htFile[c]);
print buf;
for (r in htSet) {
buf = "";
for (c in htFile)
buf = sprint ("%s\t%s", buf, htVal[c, r]);
print substr (buf, 2);
}
}
END { Table( ); }
이는 출력 테이블의 파일 및 데이터세트 순서를 유지하지 않습니다. 중요한 경우 테이블의 순서화된 버전을 유지하고 원래 순서로 반복할 수 있습니다.