특정 열 수준 교체

특정 열 수준 교체

열 형식 항목이 포함된 파일이 있는 경우 특정 열의 특정 항목만 바꾸고 변경 사항을 동일한 파일에 저장할 수 있습니까?

파일 예 abc.txt:

SR|FRUITS|COLOR|
1|Apple|Red|
2|Mango|Yellow|
3|Orange|Orange|
4|W.Melon|Green|

변화가 필요하다주황색과일부터orange_edit. 그러나 색상의 주황색은 영향을 받지 않습니다.

답변1

awk다음과 같이 두 단계로 수행할 수 있습니다.

awk '{$2="VAL";print}' input_file > temp_file
mv temp_file input_file

이렇게 하면 입력 파일이 공백으로 분할되어 두 번째 열의 값(다른 열의 경우 2 이외의 숫자)이 바뀌므로 이제 "VAL"이 됩니다. OFS출력 필드 구분 기호로 변경 하지 않으면 공백이 됩니다. 다른 것을 원한다면 따옴표 안에 'BEGIN {OFS="\t"}...' 같은 것을 추가하여 출력 필드 구분 기호를 원하는 대로 설정할 수 있습니다.

값이 일정하지 않게 하려면 더 많은 작업을 수행해야 하지만 그렇게 하도록 조정할 수 있습니다.

귀하의 사례에서 이 기능을 편집할 수 있도록 하려면 다음을 수행하십시오.

awk -F\| 'BEGIN {OFS="|";} $2~/^Orange$/ {$2="Orange_edit";} {print}' abc.txt > temp_file
mv temp_file abc.txt

이는 먼저 awk패스에 따라 필드를 분할하도록 지시합니다. 그런 다음 첫 번째 코드 블록(실행을 시작하는 키워드와 일치하는 BEGIN과 일치하는 부분)을 만들고 , 또는 출력 필드 구분 기호를 설정하여 출력 구분 기호(기본값은 공백)도 사용하도록 출력을 설정합니다. Otheus가 지적했듯이 출력 구분 기호를 입력 구분 기호와 동일하게 설정할 수 있습니다.|-F\||awkOFS{OFS=FS}

그런 다음 우리는 선을 살펴보기 시작했습니다. 참조된 두 번째 필드를 비교한 다음 다음을 사용하여 $2정규식과 일치하는지 확인합니다. 그 ~다음에 ~는 일치시키려는 정규 표현식이 있습니다. ^여기서는 필드의 시작 부분과 일치하는 것을 의미하며, 문자열 "Orange"가 있고 $필드의 끝 부분과 일치합니다. 이것은 하드코딩된 문자열이기 때문에 Otheus는 여기서 문자열 동일성을 테스트한 다음 그렇게 하고 $2=="Orange"이번에는 실제로 아무 것도 수행하지 않기 때문에 정규식 처리를 건너뛸 수 있다는 것을 정확하게 관찰했습니다. 일치가 성공하면 {}실행된 코드 블록은 새 값을 두 번째 필드에 저장합니다.

마지막으로 각 행에 대해 마지막 코드 블록을 실행 {print}하지만 위의 "주황색" 일치가 성공하면 두 번째 필드의 값을 변경하여 이전 값 대신 새 값으로 인쇄합니다.

awk이는 일반적으로 화면에 인쇄되므로(최신 버전에는 gawk이 부분을 단순화하는 옵션이 있음) 파일에 저장한 다음 파일을 다시 원래 이름으로 옮깁니다.

답변2

이를 수행하는 방법에는 여러 가지가 있습니다. 가장 간단한 것은 아마도 다음 awkperl같습니다.

  1. 그누 gawk. 비교적 새로운 버전이 설치되어 있는 경우 gawk다음과 같이 인라인으로 편집할 수 있습니다.

    gawk -i inplace -F"|" -vOFS="|"  '$2=="Orange"{$2="Orange_Edit"}1;' file 
    

    -i inplace파일을 제자리에서 편집하고, 필드 구분 기호를 gawk설정하고 , 출력 필드 구분 기호를 설정하도록 지시합니다 . 스크립트는 두 번째 필드가 인 경우에만 두 번째 필드( )를 로 설정합니다 . 이는 "현재 줄 인쇄"의 약어입니다.-F"|"|-vOFS="|"|$2Orange_EditOrange1;awk

  2. perl -i -F"\|" -lane '$F[1]="Orange_Edit" if $F[1] eq "Orange"; 
                       print join "|",@F' file 
    

    이로 인해 Perl은 주어진 값에서 선을 나누고 결과 필드를 배열 에 저장하는 -a것처럼 동작합니다 . 그런 다음 원래 값이 이면 스크립트는 두 번째 필드( 배열은 0에서 시작함)를 로 설정합니다 . 그런 다음 이러한 필드가 연결되어 인쇄됩니다.awk-F@F$F[1]Orange_EditOrange|

  3. 첫 번째 항목만 변경하려면 Orange단순화하고 사용할 수 있습니다.

    sed -i 's/Orange/Orange_Edit/' file 
    

    전체 필드만 일치시켜 더욱 강력하게 만들 수 있습니다.

    sed -i 's/|Orange|/|Orange_Edit|/' file 
    

답변3

당신은 그것을 사용할 수 있습니다 perl:

$ perl -i.bak -F'\|' -aple 's/Orange/Orange_Edit/ if $F[1] eq "Orange"' file

또는 더 안전한 버전:

$ perl -i.bak -F'\|' -aple '$F[1]=~s/^Orange$/Orange_Edit/; $_=join "|",@F' file

관련 정보