编写一个bash代码,根据另一个文件替换一个文件中的字符串

时间:2016-03-23 16:30:36

标签: bash awk

我有一个像这样的列表

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
}
}'

2 个答案:

答案 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了。