열 형식 항목이 포함된 파일이 있는 경우 특정 열의 특정 항목만 바꾸고 변경 사항을 동일한 파일에 저장할 수 있습니까?
파일 예 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\|
|
awk
OFS
{OFS=FS}
그런 다음 우리는 선을 살펴보기 시작했습니다. 참조된 두 번째 필드를 비교한 다음 다음을 사용하여 $2
정규식과 일치하는지 확인합니다. 그 ~
다음에 ~
는 일치시키려는 정규 표현식이 있습니다. ^
여기서는 필드의 시작 부분과 일치하는 것을 의미하며, 문자열 "Orange"가 있고 $
필드의 끝 부분과 일치합니다. 이것은 하드코딩된 문자열이기 때문에 Otheus는 여기서 문자열 동일성을 테스트한 다음 그렇게 하고 $2=="Orange"
이번에는 실제로 아무 것도 수행하지 않기 때문에 정규식 처리를 건너뛸 수 있다는 것을 정확하게 관찰했습니다. 일치가 성공하면 {}
실행된 코드 블록은 새 값을 두 번째 필드에 저장합니다.
마지막으로 각 행에 대해 마지막 코드 블록을 실행 {print}
하지만 위의 "주황색" 일치가 성공하면 두 번째 필드의 값을 변경하여 이전 값 대신 새 값으로 인쇄합니다.
awk
이는 일반적으로 화면에 인쇄되므로(최신 버전에는 gawk
이 부분을 단순화하는 옵션이 있음) 파일에 저장한 다음 파일을 다시 원래 이름으로 옮깁니다.
답변2
이를 수행하는 방법에는 여러 가지가 있습니다. 가장 간단한 것은 아마도 다음 awk
과 perl
같습니다.
그누
gawk
. 비교적 새로운 버전이 설치되어 있는 경우gawk
다음과 같이 인라인으로 편집할 수 있습니다.gawk -i inplace -F"|" -vOFS="|" '$2=="Orange"{$2="Orange_Edit"}1;' file
-i inplace
파일을 제자리에서 편집하고, 필드 구분 기호를gawk
설정하고 , 출력 필드 구분 기호를 설정하도록 지시합니다 . 스크립트는 두 번째 필드가 인 경우에만 두 번째 필드( )를 로 설정합니다 . 이는 "현재 줄 인쇄"의 약어입니다.-F"|"
|
-vOFS="|"
|
$2
Orange_Edit
Orange
1;
awk
펄
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_Edit
Orange
|
첫 번째 항목만 변경하려면
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