sed는 다른 파일에서 문자열을 검색하고 바꿉니다.

sed는 다른 파일에서 문자열을 검색하고 바꿉니다.

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$3if는 print의 키 입니다 else printaa[$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에 의해 생성된 부분)

관련 정보