CSV의 한 줄에 다른 텍스트를 바꾸는 방법은 무엇입니까?

CSV의 한 줄에 다른 텍스트를 바꾸는 방법은 무엇입니까?

유사한 질문이 제기되었다는 것을 알고 있지만 저는 초보자이고 지난 몇 달 동안만 Linux를 접했으며 질문의 세부 사항으로 인해 문제에 대한 다른 솔루션을 채택할 수 없습니다.

단일 행의 여러 문자열을 CSV에 표시된 특정 일치 문자열로 바꾸고 싶습니다.

예: 파일 1:

(((1[&label=1],2[&label=1])[&label=5]),3[&label=2])

file2.csv(csv 열 2개):

1[&label, "1[&tag=2,label"
2[&label, "2[&tag=5,label"
3[&label, "3[&tag=3,label"

한 줄의 파일을 (etc...)로 바꾸면 다음 1[&label과 같이 됩니다.1[&tag=2,label

(((1[&tag=2,label=1],2[&tag=5,label=1])[&label=5]),3[tag=3,&label=2])

csv에는 [&label별도의 레이블( )이 없는 1[&label항목이 포함되어 있지 않지만 [&label최종 출력 파일에는 이러한 항목이 여전히 필요합니다.

답변1

Bash를 사용하여 이를 수행하는 한 가지 방법은 다음과 같습니다.

#!/bin/bash

# read the line to act upon
line=$(head -n 1 $1)

while read substitution
do
    # get the first field, delimited by a comma
    findvar=`echo $substitution | cut -d, -f1`
    # remove the quotes and get the second field, delimited by a space
    replacevar=`echo $substitution | sed 's/"//g' | cut -d' ' -f2`
    # replace all occurrences of the find variable with the replacement
    line=${line//$findvar/$replacevar}
done < $2

echo $line

이 스크립트의 이름이 지정된 경우

substitute.sh

그럼 전화해도 돼

sh substitute.sh file1 file2.csv

이는 다음과 같은 몇 가지 가정을 합니다.

  • CSV 형식은 설명과 정확히 같습니다. 귀하의 예에서는 첫 번째 열의 값은 인용되지 않았지만 두 번째 열의 값은 인용되었습니다. 또한 이 예에서는 구분 기호 뒤에 공백이 포함되어 있습니다. 실제 CSV 형식이 다른 경우 스크립트를 조정해야 합니다.
  • CSV의 대체는 한 번에 하나씩 처리되므로 이후의 대체는 이전에 수행된 대체와 일치할 수 있습니다. 이는 귀하의 의도가 아닐 수도 있습니다.

예를 들어, 입력 라인이 다음과 같은 경우

foo bar baz

CSV 파일을 다음으로 바꾸십시오.

foo, "bar"
bar, "baz"

당신은 결과가

bar baz baz

그러나 결과는 다음과 같습니다

baz baz baz

관련 정보