![5번째 필드가 있는 파일에서만 "_"를 "|"로 바꿉니다.](https://linux55.com/image/95310/5%EB%B2%88%EC%A7%B8%20%ED%95%84%EB%93%9C%EA%B0%80%20%EC%9E%88%EB%8A%94%20%ED%8C%8C%EC%9D%BC%EC%97%90%EC%84%9C%EB%A7%8C%20%22_%22%EB%A5%BC%20%22%7C%22%EB%A1%9C%20%EB%B0%94%EA%BF%89%EB%8B%88%EB%8B%A4..png)
내 파일에는 다음 내용이 포함되어 있습니다.
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
다섯 번째 필드에서만 _
교체 해야 합니다 .|
예상 출력:
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
전제는 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
작업을 수행합니다 . 그런 다음 5번째 필드를 (배열은 0에서 시작하고 5번째 필드도 0에서 시작함)로 바꾸고 결합된 배열을 인쇄합니다 .perl
awk
-F
@F
_
|
$F[4]
|
|
배열 구분 기호를 및 print 로 설정할 수도 있습니다 "@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 방법 중 하나를 대신 사용하십시오.