sed/awk를 한 줄 방식으로 사용하여 다음 bash 스크립트를 만드는 방법에 대한 조언이 필요합니다. 또는 대신 Python을 사용할 수 있다면 이 검색 및 바꾸기 작업을 수행하는 데 좋을 것입니다.
여기에서는 "input.txt"라는 파일에 검색 패턴을 만들었습니다. 여기서 첫 번째 열은 검색용이고 두 번째 열은 바꾸기용입니다. 그런 다음 각 열 값을 배열에 할당하고 sed 유틸리티를 사용하여 for 루프를 호출하여 "file.csv"를 검색하고 교체했습니다. 이 변경은 세 번째 열에서만 발생합니다.
파일.csv
Symbol,Name,Value
*,yy03LN-1,LM-GA-G01
*,yy5310-4,YP-QL-A03
*,yy5310-5,YP-QL-A10
입력.txt
LM-GA-G01,LM-GA-G1
YP-QL-A03,YP-QL-A3
YP-QL-A10,YP-QL-A10
예상되는 결과는 "0" 숫자의 세 번째 열을 삭제하는 것입니다.
파일.csv
Symbol,Name,Value
*,yy03LN-1,LM-GA-G1
*,yy5310-4,YP-QL-A3
*,yy5310-5,YP-QL-A10
이 상황을 기반으로 더 잘 작동하는 쉘 스크립트를 만들었지만 이 작업을 수행하려면 한 줄 또는 짧은 스크립트와 같은 도움이 필요합니다.
#!/bin/bash
post=$(cat file.csv|awk -F "," '{print $NF}'| grep -v Index)
postar=($post)
for (( i=0; i<${#postar[@]}; ++i )); do
grep "${postar[$i]}" input.txt >> filtered.txt
done
left=$(cat filtered.txt|awk -F "," '{print $1}')
leftar=($left)
right=$(cat filtered.txt|awk -F "," '{print $2}')
rightar=($right)
for (( i=0; i<${#leftar[@]}; ++i )); do
sed -i -e 's/'"${leftar[$i]}"'/'"${rightar[$i]}"'/g' file.csv
done
input.txt
참고: - 행 수가 다릅니다 file.csv
.
제안해주세요
고마워요 제이
답변1
다음은 CSV 인식 도구를 사용합니다.밀러( mlr
)는 필드 값에 포함된 모든 숫자의 0 채우기를 제거합니다 Value
.
$ mlr --csv put '$Value = gsub($Value, "([A-Z])0+([1-9])", "\1\2")' file
Symbol,Name,Value
*,yy03LN-1,LM-GA-G1
*,yy5310-4,YP-QL-A3
*,yy5310-5,YP-QL-A10
이 함수를 사용하면 대문자( ) 뒤에 나타나는 숫자(반복 가능)와 0이 아닌 숫자( )를 Value
일치시켜 필드를 수정할 수 있습니다 . gsub()
이러한 일치 항목은 대문자와 0이 아닌 숫자로 대체되어 정수를 채우는 0 문자열을 제거합니다.0
[A-Z]
[1-9]
mlr
해당 옵션을 사용하여 수정 작업을 수행할 수 있습니다 -I
.
답변2
파일이 너무 크지 않으면 다음을 사용할 수 있습니다 awk
.
awk 'BEGIN{FS=OFS=","}
NR==FNR{a[$1]=$2;next}
{print $1,$2,($3 in a ? a[$3] : $3)}' input.txt file.csv
BEGIN{FS=OFS=","}
필드 구분 기호를 다음으로 설정하세요.,
NR==FNR
번호 레코드가 파일 번호 레코드와 같은 경우(첫 번째 파일에 있는 경우)a[$1]=$2
첫 번째 필드를 키로 사용하여 두 번째 필드를 배열에 저장합니다.$3 in a ? a[$3] : $3
$3
if는 print의 키 입니다 else printa
a[$3]
$3
답변3
이것이 필요한 것이 아닌 경우:
$ sed 's/0*\([0-9]*$\)/\1/' file.csv
Symbol,Name,Value
*,yy03LN-1,LM-GA-G1
*,yy5310-4,YP-QL-A3
*,yy5310-5,YP-QL-A10
그런 다음 질문을 편집하여 이것이 작동하지 않는 사례를 포함하는 보다 현실적인 대표적인 예를 제공하십시오.
답변4
둘 이상 삭제되면 0
프로그램이 동적으로 생성될 수 있습니다 sed
.
awk -F, '{printf "s/%s/%s/\n",$1,$2}' input.txt
어디
-F,
awk에게 구분 기호로 사용하라고 지시하세요,
.printf "s/%s/%s/\n",$1,$2
대체품을 생산할 것입니다
이것은 귀하의 의견을 제공합니다
s/LM-GA-G01/LM-GA-G1/
s/YP-QL-A03/YP-QL-A3/
s/YP-QL-A10/YP-QL-A10/
이제 sed에 입력하세요.
awk -F, '{printf "s/%s/%s/\n",$1,$2}' input.txt | sed -i -f - file.csv
어디
-i
내부 버전 사용-f -
stdin의 sed 명령어 사용(awk에 의해 생성된 부분)