5번째 필드가 있는 파일에서만 "_"를 "|"로 바꿉니다.

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

다섯 번째 필드에서만 _교체 해야 합니다 .|

예상 출력:

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="|"}
    필드 구분 기호를 로 설정합니다 |. 이런 식으로 우리는 이를 $55번째 필드 등으로 처리할 수 있습니다.
  • {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에서 시작함)로 바꾸고 결합된 배열을 인쇄합니다 .perlawk-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 방법 중 하나를 대신 사용하십시오.

관련 정보