내 파일에는 아래 내용이 있습니다.
rat|minty|ruhul|balaji|rat_123|decode|rat_123|abc|def|ghi|jkl|rat|cde|ind|rat
rat|minty|ruhul|balaji|rat1_123|decode|rat_123|abc|def|ghi|jkl|rat|cde|ind|rat
rat|minty|ruhul|balaji|rat2_123|decode|rat_123|abc|def|ghi|jkl|rat|cde|ind|rat
_
로 교체해야 하는데 |
5번째 필드에서만 가능합니다.
예상 출력:
rat|minty|ruhul|balaji|rat|123|decode|rat_123|abc|def|ghi|jkl|rat|cde|ind|rat
rat|minty|ruhul|balaji|rat1|123|decode|rat_123|abc|def|ghi|jkl|rat|cde|ind|rat
rat|minty|ruhul|balaji|rat2|123|decode|rat_123|abc|def|ghi|jkl|rat|cde|ind|rat
답변1
와 함께 awk
사용gsub()
5번째 필드에서:
$ awk 'BEGIN{FS=OFS="|"} {gsub("_",FS,$5)}1' file
rat|minty|ruhul|balaji|rat|123|decode|rat_123|abc|def|ghi|jkl|rat|cde|ind|rat
rat|minty|ruhul|balaji|rat1|123|decode|rat_123|abc|def|ghi|jkl|rat|cde|ind|rat
rat|minty|ruhul|balaji|rat2|123|decode|rat_123|abc|def|ghi|jkl|rat|cde|ind|rat
설명
BEGIN{FS=OFS="|"}
필드 구분 기호를 로 설정합니다|
. 이렇게 하면$5
5번째 필드 등으로 주소를 지정할 수 있습니다.{gsub("_",FS,$5)}
_
5번째 필드의 를 모두 로 바꿉니다FS
. 즉,|
.1
awk의 기본 동작을 실행합니다: 현재(수정된) 레코드를 인쇄합니다.
답변2
5번째 필드에 교체할 sed
필드가 하나만 있는 경우_
$ sed -E 's/^(([^|]+\|){4}[^_]+)_/\1|/' ip.txt
rat|minty|ruhul|balaji|rat|123|decode|rat_123|abc|def|ghi|jkl|rat|cde|ind|rat
rat|minty|ruhul|balaji|rat1|123|decode|rat_123|abc|def|ghi|jkl|rat|cde|ind|rat
rat|minty|ruhul|balaji|rat2|123|decode|rat_123|abc|def|ghi|jkl|rat|cde|ind|rat
5번째 필드를 모두 교체해야 하는 경우 perl
(1과 유사 awk
) 해결 방법 :_
$ perl -F'\|' -lane '$F[4] =~ tr/_/|/; print join "|",@F' ip.txt
rat|minty|ruhul|balaji|rat|123|decode|rat_123|abc|def|ghi|jkl|rat|cde|ind|rat
rat|minty|ruhul|balaji|rat1|123|decode|rat_123|abc|def|ghi|jkl|rat|cde|ind|rat
rat|minty|ruhul|balaji|rat2|123|decode|rat_123|abc|def|ghi|jkl|rat|cde|ind|rat
답변3
와 함께 perl
:
$ perl -F'\|' -ne '$F[4]=~s/_/|/; print join "|", @F' file
rat|minty|ruhul|balaji|rat|123|decode|rat_123|abc|def|ghi|jkl|rat|cde|ind|rat
rat|minty|ruhul|balaji|rat1|123|decode|rat_123|abc|def|ghi|jkl|rat|cde|ind|rat
rat|minty|ruhul|balaji|rat2|123|decode|rat_123|abc|def|ghi|jkl|rat|cde|ind|rat
make -a
는 에서 주어진 문자의 각 입력 행을 배열에 저장된 필드로 분할하는 것과 perl
같은 역할을 합니다 . 그런 다음 5번째 필드를 로 대체하고 (배열은 0에서 시작하므로 5번째 필드도 마찬가지임) 로 결합된 배열을 인쇄합니다 .awk
-F
@F
_
|
$F[4]
|
배열 구분 기호를 로 설정하여 동일한 작업을 수행하지만 더 간결하게 |
인쇄할 수도 있습니다."@F"
$ perl -F'\|' -ne '$"="|"; $F[4]=~s/_/|/; print "@F"' file
rat|minty|ruhul|balaji|rat|123|decode|rat_123|abc|def|ghi|jkl|rat|cde|ind|rat
rat|minty|ruhul|balaji|rat1|123|decode|rat_123|abc|def|ghi|jkl|rat|cde|ind|rat
rat|minty|ruhul|balaji|rat2|123|decode|rat_123|abc|def|ghi|jkl|rat|cde|ind|rat
물론 특정 예에서는 _
5번째 필드가 줄의 첫 번째 필드이기도 하므로 파일이 실제로 이와 같으면 다음을 수행하는 것으로 충분합니다.
$ perl -pe 's/_/|/' file
rat|minty|ruhul|balaji|rat|123|decode|rat_123|abc|def|ghi|jkl|rat|cde|ind|rat
rat|minty|ruhul|balaji|rat1|123|decode|rat_123|abc|def|ghi|jkl|rat|cde|ind|rat
rat|minty|ruhul|balaji|rat2|123|decode|rat_123|abc|def|ghi|jkl|rat|cde|ind|rat
또는
$ sed 's/_/|/' file
rat|minty|ruhul|balaji|rat|123|decode|rat_123|abc|def|ghi|jkl|rat|cde|ind|rat
rat|minty|ruhul|balaji|rat1|123|decode|rat_123|abc|def|ghi|jkl|rat|cde|ind|rat
rat|minty|ruhul|balaji|rat2|123|decode|rat_123|abc|def|ghi|jkl|rat|cde|ind|rat
다음과 동일한 접근 방식을 사용할 수 있습니다 awk
.
$ awk -F'|' 'sub("_","|")' file
rat|minty|ruhul|balaji|rat|123|decode|rat_123|abc|def|ghi|jkl|rat|cde|ind|rat
rat|minty|ruhul|balaji|rat1|123|decode|rat_123|abc|def|ghi|jkl|rat|cde|ind|rat
rat|minty|ruhul|balaji|rat2|123|decode|rat_123|abc|def|ghi|jkl|rat|cde|ind|rat
또는 5번째 필드만 지정하고 _
5번째 필드에 있는 모든 항목을 바꾸려면@fedorqui의 답변:
$ awk -F'|' -vOFS='|' 'gsub("_","|",$5)' file
rat|minty|ruhul|balaji|rat|123|decode|rat_123|abc|def|ghi|jkl|rat|cde|ind|rat
rat|minty|ruhul|balaji|rat1|123|decode|rat_123|abc|def|ghi|jkl|rat|cde|ind|rat
rat|minty|ruhul|balaji|rat2|123|decode|rat_123|abc|def|ghi|jkl|rat|cde|ind|rat
이 두 awk
솔루션은 대체가 성공한 줄에만 인쇄됩니다. 패턴과 일치하지 않는 행이 있는 경우( _
5번째 필드에 없음) @fedorqui의 접근 방식이나 Perl 접근 방식 중 하나를 대신 사용하십시오.