bashを使用して他のcsvファイルの値を使用してcsvファイルの値を更新する方法

bashを使用して他のcsvファイルの値を使用してcsvファイルの値を更新する方法

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.txtdata2OPのファイルに使用しました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
$

注 - スクリプトにはエラーチェックはなく、元のファイルは上書きされません。

関連情報