두 파일을 비교하고 열이 동일하면 다음 열을 일부 값으로 바꿉니다.

두 파일을 비교하고 열이 동일하면 다음 열을 일부 값으로 바꿉니다.

다른 파일과 비교할 때 파일의 열 값을 어떻게 바꾸나요?

파일이 두 개 있어요테스트1.csv그리고test2.csv; 컬럼 을 교체해야 합니다 empdep.테스트1.csv다음과 같은 값을 갖는 경우"징후*". 두 번째 파일test2.csv이를 대체하는 데 필요한 값이 있습니다."징후*".

참고 : 나는 다음을 사용하고 있습니다 ksh.테스트1.csv약 2,048,576개의 행이 있고test2.csv10000개의 행이 있습니다.

테스트1.csv

empname,place,empdep
aaaa,city1,001
bbbb,city2,sign-1
dddd,city1,005
ffff,city5,sign-2
hhhh,city7,sign-1

test2.csv

empname,new
aaaa,001
bbbb,002
cccc,003
dddd,005
eeee,006
ffff,007
gggg,008
hhhh,009

예상 결과:

empname,place,empdep
aaaa,city1,001
bbbb,city2,002
dddd,city1,005
ffff,city5,007
hhhh,city7,009

답변1

와 함께 awk:

awk '
  BEGIN{ FS=OFS="," } # set input/output field separator to `,`
  NR==FNR{            # if this is the first file `test2.csv`
    a[$1]=$2          # store field2 in array `a` using field1 as index
    next              # continue with next line
  } 
  $3 ~ /^sign/{       # if field3 of `test1.csv` begins with `sign`
    $3=a[$1]          # replace the field with array value (index of field1)
  }
  1                   # print the line
' test2.csv test1.csv

답변2

이것은 간단한 방법 중 하나입니다.

for i in $(cat text1.csv)  
do  
    name=$(echo $i | cut -d',' -f1)   
    empdep=$(echo $i | cut -d',' -f3)  
    newvalue=$(grep $name text2.csv | cut -d',' -f2)    
    if [[ $empdep = sign* ]]    
    then  
        sed -n "s/^$name,\(.*\),.*/$name,\1,$newvalue/pg" text1.csv  
    else  
        echo $i  
    fi  
done

답변3

및 .ksh​ 구문 분석에 sed사용sedtest2.csv그리고 채우기연관 배열 ${new[@]}. 그런 다음 루프를 통해테스트1.csv그리고 사용패턴 대체원하는 출력을 인쇄하려면 다음을 수행하십시오.

typeset -A new $(sed -n '2,${s/^/new[/;s/,/]=/p}' test2.csv)
while IFS=, read a b c; do echo $a,$b,${c/#sign*/${new[$a]}}; done < test1.csv

산출:

empname,place,empdep
aaaa,city1,001
bbbb,city2,002
dddd,city1,005
ffff,city5,007
hhhh,city7,009

참고: 이 경우 입력 파일에는 따옴표가 없으며 코드는 따옴표가 없어 시각적으로 더 간단합니다. 입력 파일 중 하나에 공백이 포함되어 있거나 포함될 수 있는 경우 위의 변수는~ 해야 하다인용되다.

답변4

csv-merge -N t1 -p test1.csv -N t2 -p test2.csv | 
csv-sqlite -T 'select t1.empname, t1.place, case when t1.empdep like "sign%" then t2.new else t1.empdep end as empdep
from t1 left join t2 on t1.empname = t2.empname'

csv-merge 및 csv-sqlite의 출처는 다음과 같습니다.https://github.com/mslusarz/csv-nix-tools

관련 정보