我有一个像这样的列表
G1 John
G2 Jack
G3 Ray
G4 Tim
和另一个文件中的第二个列表
Jack John
Tim Jack
我想写一个bash代码,它给我一个像这样的第三个文件
G2 G1
G4 G2
EDIT 我的解决方案就是这样,但是当我用bash写它时没有任何反应。
#! /bin/bash
INPUTFILE="id.tsv"
DATAFILE="g.tsv"
OUTFILE="output.csv"
awk 'BEGIN {
while (getline < "'"$INPUTFILE"'")
{
split($0,ft,"\t");
id=ft[1];
name=ft[2];
key=id;
data=name;
nameArr[key]=data;
}
close("'"$INPUTFILE"'");
while (getline < "'"$DATAFILE"'")
{
split($0,ft,",");
id1=ft[1]; # Id is the first column
id2=ft[2]; # Phonenumber is the second
name1=nameArr[id1];
name2=nameArr[id2];
print name1","name2 > "'"$OUTFILE"'"; # Print directly to the outputfile
}
}'
答案 0 :(得分:2)
awk
救援!
$ awk 'NR==FNR{a[$2]=$1; next} {print a[$1], a[$2]}' file1 file2
G2 G1
G4 G2
答案 1 :(得分:1)
Karakfa使用awk的答案非常简洁,因此我可能更喜欢我自己脚本中的方法。
但是,值得注意的是,您可以使用关联数组直接在bash(版本4及更高版本)中执行此操作:
declare -A map
while read -r line; do
id="${line% *}"
name="${line#* }"
map["$name"]="$id"
done < file1
while read -r line; do
ids=()
for name in $line; do
ids+=( "${map["$name"]}" )
done
echo "${ids[@]}"
done < file2
输出:
G2 G1
G4 G2
请注意,此代码不可移植。如果担心可移植性,那就更有理由使用awk了。