次の4つのtsv(タブ区切り)ファイルがあります。
ファイル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}
このコマンドは機能しますが、値が送信されます。 1列目と2列目の値がnullで、3列目と4列目の値が4と4の場合、このコマンドで得られる出力は1列目と2列目の値は4ですが、3列目と4列目は値があります。です。 NULL値があります。そこで私がawk
言及した内容を使ってTSVファイルを個別に結合しようとしました。まず、forfile_1
とfile_2
getを実行してoutput_1
から、Joinfile_3
とfile_4
getを実行しますoutput_2
。その後、出力_1と出力_2のマージを使用します$ join output_1 output_2
が、4つのファイルの値のみを取得します。 1つのファイルにのみ存在していたデータを失いました。
アドバイスいただきありがとうございます。
ありがとう
答え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
今はアドバイスをいたします。必要に応じて後でコードを書くことができます。
すべてのファイルを読み取るときに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( ); }
これは、出力テーブルのファイルとデータセットの順序を維持しません。これが重要な場合は、テーブルの順序付きバージョンを維持し、元の順序で繰り返すことができます。