如何用sed/awk处理竖线分隔文件:替换第4列Dont开头字段为空?
解决竖线分隔文件的第4字段批量处理问题
你之前的sed命令思路偏了——sed '/^Dont/s/[^|]*//4'是找行首以Dont开头的行再修改第4字段,但我们要的是第4个字段本身以Dont开头的情况,不管行首内容是什么。下面给你两个靠谱的解决方案:
方案一:用awk(推荐,逻辑更直观)
awk处理分隔符文本天生顺手,直接指定分隔符为|,判断第4字段是否符合条件后修改输出即可:
BEGIN {FS=OFS="|"} $4 ~ /^Dont/ {$4=""} 1
BEGIN {FS=OFS="|"}:设置输入、输出的分隔符都是竖线,保证输出格式和输入完全一致$4 ~ /^Dont/:判断第4个字段是否以"Dont"开头(正则^Dont表示字段起始位置匹配){$4=""}:如果符合条件,把第4字段设为空字符串- 最后的
1:awk里非0值表示执行默认操作(打印当前行),不管是否修改过都会输出
直接在命令行运行的话可以这么写:
awk 'BEGIN {FS=OFS="|"} $4 ~ /^Dont/ {$4=""} 1' your_input_file.txt > output.txt
方案二:用sed(适合偏好sed的场景)
sed需要用正则精准定位第4个字段,思路是捕获前三个字段的内容,再替换第4个字段中以Dont开头的部分:
sed -E 's/^([^|]*\|[^|]*\|[^|]*\|)Dont[^|]*/\1/' your_input_file.txt
-E:启用扩展正则表达式,减少转义符号的使用^([^|]*\|[^|]*\|[^|]*\|):捕获前三个字段加后面的竖线(比如16815966|Mr|Fit 5|)Dont[^|]*:匹配第4字段中以Dont开头的所有内容(直到下一个竖线)\1:替换成之前捕获的内容,相当于把第4字段的Dont开头部分删掉,留空
测试验证
用你提供的示例输入测试,两个命令都会输出你期望的结果:
16815966|Mr|Fit 5||15-07-2015|||||||||||||0|2|0|0.00|0|
21875307|Mr|Father||X|31-12-1899|||||||||||||0|118|0|0.00|0|
19180802|Mr|Dontye|Harr|01-01-1900|||||6666|Avenue||||||06-09-2013|0|26|2|396.00|1|
内容的提问来源于stack exchange,提问作者Dev
相关产品推荐
相关产品推荐

