bash를 사용하여 다른 csv 파일의 값을 사용하여 csv 파일의 값을 업데이트하는 방법

bash를 사용하여 다른 csv 파일의 값을 사용하여 csv 파일의 값을 업데이트하는 방법

두 개의 파일이 있는데 각각 두 개의 열에 데이터가 정렬되어 있습니다. 열은 세미콜론으로 구분됩니다. 첫 번째 파일(11_19.txt)에는 더 많은 줄이 포함되어 있고 두 번째 파일(12_19.txt)은 첫 번째 파일을 업데이트합니다. 첫 번째 섹션의 각 행에는 ID가 있으므로 스크립트가 두 파일 모두에서 동일한 ID를 가진 행을 찾으면 첫 번째 파일을 두 번째 파일의 데이터로 업데이트해야 합니다.

첫 번째 파일이 다음과 같다고 가정해 보겠습니다.

$ cat 11_19.txt
id=123;112233
id=456;445566
id=789;778899
id=000;000000

두 번째 파일은 다음과 같습니다.

$ 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

둘째, 두 번째 파일을 사용하여 다른 확장자를 가진 다른 파일(예: html 파일)의 값을 변경하고 html 파일에서 ID가 일치하는 두 번째 파일에 두 번째 값을 추가하고 싶습니다.

<!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위의 한 줄의 코드에 사용된 다양한 옵션의 의미를 알 수 있습니다.

답변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
$

참고 - 스크립트에는 오류 검사가 없으며 원본 파일을 덮어쓰지 않습니다.

관련 정보