두 개의 파일이 있는데 각각 두 개의 열에 데이터가 정렬되어 있습니다. 열은 세미콜론으로 구분됩니다. 첫 번째 파일(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.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
위의 한 줄의 코드에 사용된 다양한 옵션의 의미를 알 수 있습니다.
답변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
$
참고 - 스크립트에는 오류 검사가 없으며 원본 파일을 덮어쓰지 않습니다.