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

编写bash代码以根据另一个文件替换一个文件中的字符串,bash,awk,Bash,Awk,我有一张这样的清单 G1 John G2 Jack G3 Ray G4 Tim G2 G1 G4 G2 和另一个文件中的第二个列表 Jack John Tim Jack 我想写一个bash代码,给我第三个这样的文件 G1 John G2 Jack G3 Ray G4 Tim G2 G1 G4 G2 编辑 我的解决方案是这样的,但当我在bash中编写它时,什么都不会发生 #! /bin/bash INPUTFILE="id.tsv" DATAFILE="g.tsv" OUTFILE="o

我有一张这样的清单

G1 John
G2 Jack
G3 Ray
G4 Tim
G2 G1
G4 G2
和另一个文件中的第二个列表

Jack John
Tim Jack
我想写一个bash代码,给我第三个这样的文件

G1 John
G2 Jack
G3 Ray
G4 Tim
G2 G1
G4 G2
编辑 我的解决方案是这样的,但当我在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
}
}'
#/bin/bash
INPUTFILE=“id.tsv”
DATAFILE=“g.tsv”
OUTFILE=“output.csv”
开始{
而(getline<“'$INPUTFILE””)
{
拆分($0,ft,“\t”);
id=英尺[1];
名称=英尺[2];
key=id;
数据=名称;
nameArr[key]=数据;
}
关闭(“$INPUTFILE””);
而(getline<““$DATAFILE””)
{
拆分($0,英尺,“,”);
id1=ft[1];#Id是第一列
id2=ft[2];#电话号码是第二个
name1=nameArr[id1];
name2=nameArr[id2];
打印名称1”、“名称2>”“$OUTFILE”;#直接打印到输出文件
}
}'

awk
救援

$ awk 'NR==FNR{a[$2]=$1; next} {print a[$1], a[$2]}' file1 file2

G2 G1
G4 G2

awk
救援

$ awk 'NR==FNR{a[$2]=$1; next} {print a[$1], a[$2]}' file1 file2

G2 G1
G4 G2

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

请记住,此代码是不可移植的。如果要考虑可移植性,那就更应该使用awk了。

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

请记住,此代码是不可移植的。如果要考虑可移植性,那就更应该使用awk。

使用awk。使用第一个文件中的键和值创建一个数组,然后循环第二个文件中的所有字段并进行替换。试试看,如果你卡住了,告诉我们。用awk。使用第一个文件中的键和值创建一个数组,然后循环第二个文件中的所有字段并进行替换。试试看,如果你卡住了,请告诉我们。谢谢。很有魅力,谢谢。工作起来很有魅力。