Напишите bash-код для замены строк в одном файле другим файлом

У меня есть такой список

G1 John
G2 Jack
G3 Ray
G4 Tim

и второй список в другом файле

Jack John
Tim Jack

Я хочу написать код Bash, который дает мне третий файл, как это

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

2 ответа

Решение

awk в помощь!

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

G2 G1
G4 G2

Ответ Каракфы с использованием 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.

Другие вопросы по тегам