次の2つのファイルがあります。
# File 1 has 3 columns:
SampleName Type Position
5R01924 ABC 92184093
5R01028 ABC 15589809
5R01092 ABC 48759348
# File 2 has many columns.
# Column 2 is the Position
# Columns 5 to end are the different SampleNames
A Position B C 5R01924 5R01028 5R01092
1 15589809 2 3 D:E:F:G H:I:J:K L:M:N:O
1 92184093 2 3 P:Q:R:S T:U:V:W X:Y:Z:AA
1 48759348 2 3 AB:AC:AD:AE AF:AG:AH:AI AJ:AK:AL:AM
最初のファイルに4番目の列を追加するか、ファイル1をコピーして、この新しい3番目のファイルに4番目の列を追加したいと思います。
列4には、ファイル1のインデックスを使用してファイル2から抽出された正しい情報を含める必要があります。したがって、ファイル1の行1は、ファイル2の行2に移動して列5(5R01924)から情報を抽出することを意味します。しかし、私はこの情報のR部分だけが欲しいです。したがって、出力は次のようになります。
# file 3 or append column 4 to file 1
SampleName Type Position Output
5R01924 ABC 92184093 R
5R01028 ABC 15589809 J
5R01092 ABC 48759348 AL
これまで、私は次のようなものを持っています:
while IFS=" " read -r value1 value2 value3
do
awk '$2 == "${value3}" {
# find column # from name of value 1 (save as col variable)
print split(${col},a,":"), a[3]
}' file2 >> file3.txt
done
# where does file 1 go?
助けてください:)
ベストアンサー1
awkはそれを自分で処理できます。ここに "combine.awk"ファイルがあります。
# first file, first line
FILENAME == ARGV[1] && FNR == 1 {
for (i=5; i<=NF; i++) head[i] = $i
}
# first file, subsequent lines
FILENAME == ARGV[1] && FNR > 1 {
for (i=5; i<=NF; i++) {
split($i, f, /:/)
value[$2, head[i]] = f[3]
}
}
# second file
FILENAME == ARGV[2] {
print $0, (FNR == 1 ? "Output" : value[$3, $1])
}
それではこう呼びます。
awk -f combine.awk file2 file1 > file3
出力ファイルには以下が含まれます。
SampleName Type Position Output
5R01924 ABC 92184093 R
5R01028 ABC 15589809 J
5R01092 ABC 48759348 AL