2016-03-23 14 views
0

に応じて一つのファイル内の文字列を置換するためのbashコードを書く私はbashのを書きたいです私は、この別のファイルにこの</p> <p>及び第二のリストのように、私はリストを持っている</p> <pre><code>Jack John Tim Jack </code></pre> <p>を別のファイル

G2 G1 
G4 G2 

私のソリューションはこれです EDITが、nothiのような3つ目のファイルを与えるコード私が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 
} 
}' 
+3

awkを使用してください。最初のファイルのキーと値を使用して配列を作成し、2番目のファイルのすべてのフィールドをループして置き換えます。それを試して、あなたが立ち往生した場合は私たちに知らせてください。 –

答えて

2

awkレスキュー!

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

G2 G1 
G4 G2 
+0

ありがとうございます。魅力のように動作します。 – Pegah

1

awakを使用したKarakfaの回答は非常に簡潔であり、その理由から私はおそらく自分のスクリプトの中でその方法を好むでしょう。

しかし、それはあなたが連想配列を使用しては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を代わりに使用するさらに大きな理由です。

関連する問題