유사한 질문이 제기되었다는 것을 알고 있지만 저는 초보자이고 지난 몇 달 동안만 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