将“_”替换为“|” 仅在第 5 个字段的文件中

uni*_*ser 6 text-processing

我的文件有以下内容:

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
Run Code Online (Sandbox Code Playgroud)

我只需要替换_|但仅在第 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
Run Code Online (Sandbox Code Playgroud)

fed*_*qui 20

使用awkgsub()在第 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
Run Code Online (Sandbox Code Playgroud)

解释

  • BEGIN{FS=OFS="|"}
    将字段分隔符设置为|. 这样,我们可以将地址$5作为第 5 个字段,依此类推。
  • {gsub("_",FS,$5)}
    _第 5 个字段中的所有 替换为FS。也就是说,与|.
  • 1
    触发 awk 的默认动作:打印当前(修改过的)记录。

  • 高尔夫球!`gsub("_",FS,$5)+1`。 (5认同)

Sun*_*eep 8

随着sed提供的第5场只有一个_被替换

$ 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
Run Code Online (Sandbox Code Playgroud)

如果要替换第 5 个字段中的所有内容,则使用perl(类似于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
Run Code Online (Sandbox Code Playgroud)