2つのファイルがあり、それぞれ2つの列にデータがソートされています。列はセミコロンで区切られます。最初のファイル(11_19.txt)はより多くの行を含み、2番目のファイル(12_19.txt)は最初のファイルを更新します。最初のセクションの各行にはIDがあるため、スクリプトが両方のファイルで同じIDを持つ行を見つけた場合は、最初のファイルを2番目のファイルのデータで更新する必要があります。
最初のファイルが次のようになっているとします。
$ cat 11_19.txt
id=123;112233
id=456;445566
id=789;778899
id=000;000000
2番目のファイルは次のとおりです。
$ cat 12_19.txt
id=123;123123
id=000;999999
スクリプトの予想結果:
$ ./script.sh 11_19 12_19
11_19
id=123;123123
id=456;445566
id=789;778899
id=000;999999
csvの一部を配列に変換しようとしましたが、うまくいきませんでした。
id=($(cut -f1 -d, $2))
info=($(cut -f2 -d, $2))
for id in ${id[@]}; do
if grep "$id" $1; then
sed -E s/id="$id";.*/id="$id";$info"/ $1>$1
else
:
fi
done
次に、2番目のファイルを使用して別の拡張子を持つ別のファイル(htmlファイルなど)の値を変更し、htmlファイル内のIDが一致する2番目のファイルに2番目の値を追加したいと思います。
<!DOCTYPE html>
<html>
<body>
...
<p1 id=123></p1>
予想出力:
<!DOCTYPE html>
<html>
<body>
...
<p1 id=123>123123</p1>
答え1
[編集するdata1
:OPのファイル11_19.txt
とdata2
OPのファイルに使用しました12_19.txt
。
ノート:図のように、data1とdata2の最初の列を最初にソートしてから、最初の列に対してJOINを実行する必要があります。
$ cat data1
id=123;112233
id=456;445566
id=789;778899
id=000;000000
$ cat data2
id=123;123123
id=000;999999
その後、以下を発行してください。
$ sed -E 's/\;.*\;/;/' <(join -a1 -j 1 -t";" <(sort data1) <(sort data2))
id=000;999999
id=123;123123
id=456;445566
id=789;778899
またはそれに対応するもの(結果):
$ join -a1 -j 1 -t";" <(sort data1) <(sort data2) | sed -E 's/\;.*\;/;/'
id=000;999999
id=123;123123
id=456;445566
id=789;778899
man join
、端末man sed
ではinfo sed
、上記の1行のコードで使用されているさまざまなオプションの意味がわかります。
答え2
簡単なbash
スクリプト:
$ cat script.sh
!/bin/bash
file1=$1
file2=$2
while IFS=';' read a b
do
r="$b"
while IFS=';' read c d
do
if [ "$a" == "$c" ]
then
r="$d"
fi
done < $file2
printf "%s;%s\n" $a $r
done < $file1
$ ./script.sh 11_19 12_19
id=123;123123
id=456;445566
id=789;778899
id=000;999999
$
注 - スクリプトにはエラーチェックはなく、元のファイルは上書きされません。