【发布时间】:2016-12-14 18:45:59
【问题描述】:
如何在倒数第二个管道之后删除管道分隔文件中的所有内容?喜欢这条线
David|3456|ACCOUNT|MALFUNCTION|CANON|456
结果应该是
David|3456|ACCOUNT|MALFUNCTION
【问题讨论】:
如何在倒数第二个管道之后删除管道分隔文件中的所有内容?喜欢这条线
David|3456|ACCOUNT|MALFUNCTION|CANON|456
结果应该是
David|3456|ACCOUNT|MALFUNCTION
【问题讨论】:
在每行末尾替换|(string without pipe)|(string without pipe):
sed 's/|[^|]*|[^|]*$//' inputfile
【讨论】:
使用awk,类似
awk -F'|' 'BEGIN{OFS="|"}{NF=NF-2; print}' inputfile
David|3456|ACCOUNT|MALFUNCTION
(或)如果您知道总列数,则使用cut,即6 -> 4
cut -d'|' -f -4 inputfile
David|3456|ACCOUNT|MALFUNCTION
【讨论】:
cygwin 下的Windows 机器上?您使用的是哪个 Linux 和哪个awk 版本?你能输出awk --version 吗?和which awk
awk 命令之前,你能做到dos2unix < /home/user/file.txt 吗?
one-true-awk (AKA nawk) 不会重新评估记录,直到对其字段之一进行分配。以下将按预期工作:{NF-=2;$1=$1}1
我会使用的命令是
cat input.txt | sed -r 's/(.*)\|.*/\1/' > output.txt
【讨论】:
\|[^|]*\|[\|]*$ 吗?
纯 Bash 解决方案:
while IFS= read -r line || [[ -n $line ]] ; do
printf '%s\n' "${line%|*|*}"
done <inputfile
有关while 循环如何工作的详细信息,请参阅Reading input files by line using read command in shell scripting skips last line(尤其是answer by Jahid)。
有关${line%|*|*} 的信息,请参阅pattern matching in Bash。
【讨论】: