[英]How to replace delimiter from a data field in a delimited file
专家,我正在尝试替换 pipe 字符“|” 来自 pipe 分隔文件中的数据字段。
记录有 12 个字段,最后一个字段有 '|' 作为数据的一部分。
记录就像-
A|B|C|D|E|F|G|H|I|J|K|TextWith|Delimiter
我想用空格替换最后一个字段中的分隔符。 我如何实现它? 我尝试了一些 awk 命令,但没有得到想要的结果。
期望的结果-
A|B|C|D|E|F|G|H|I|J|K|TextWith Delimiter
有什么建议么?
这有效:
echo 'A|B|C|D|E|F|G|H|I|J|K|TextWith|Delimiter' |
awk 'BEGIN{FS=OFS="|"}
{$(NF-1)=$(NF-1) " " $(NF); NF=NF-1} 1'
或sed
:
echo 'A|B|C|D|E|F|G|H|I|J|K|TextWith|Delimiter' |
sed -E 's/\|([^|]*)$/ \1/'
或gawk
(Linux 原生):
echo 'A|B|C|D|E|F|G|H|I|J|K|TextWith|Delimiter' |
gawk '{match($0, "(.*)\\|([^|]*$)", arr); print arr[1] " " arr[2]}'
或Perl
:
echo 'A|B|C|D|E|F|G|H|I|J|K|TextWith|Delimiter' |
perl -lpe 's/\|([^|]*$)/ $1/'
任何印刷品:
A|B|C|D|E|F|G|H|I|J|K|TextWith Delimiter
您已经发布了两次评论不适用于我在上面评论中粘贴的记录(如果字段中有 *,它会继续尝试列出当前目录中的所有文件)
这可能是 shell 的引用和上下文问题。
考虑:
$ echo *
file file.txt powerlog
对比:
$ echo "*"
*
第一个由 shell 扩展(因为该字符串没有被引用)并且该扩展是当前目录中文件的名称。 第二个是文字字符串*
一个简单的sed
方法:
$ echo "A|B|C|D|E|F|G|H|I|J|K|TextWith|Delimiter" | sed 's/|/ /12'
A|B|C|D|E|F|G|H|I|J|K|TextWith Delimiter
12 告诉它只替换每行正则表达式的第 12 个匹配项。
这是另一个使用包含星号的输入的调用:
$ cat line
A|5|A|1|u|5|L|2|O|H|V|**** SETT|LEMENT DOCUMENTATION **** FinalOffer **** REASON : had been oot work previously **** SOURCE OF FUNDS : work **** DISCLOSURE READ : YES **** DELINQUENCY STAGE: RECOVERY **** ACCOUNT BALANCE : $2.46 **** SIF AMOUNT : $12**** PERCENTAGE : 19 % **** NUMBER OF DAYS : 128 **** PAYMENT 1: $50 DATE1: 7/21/2020
$ sed 's/|/ /12' line
A|5|A|1|u|5|L|2|O|H|V|**** SETT LEMENT DOCUMENTATION **** FinalOffer **** REASON : had been oot work previously **** SOURCE OF FUNDS : work **** DISCLOSURE READ : YES **** DELINQUENCY STAGE: RECOVERY **** ACCOUNT BALANCE : $2.46 **** SIF AMOUNT : $12**** PERCENTAGE : 19 % **** NUMBER OF DAYS : 128 **** PAYMENT 1: $50 DATE1: 7/21/2020
这是 awk 方法:
awk -F\| -v OFS=\| '{ print $1,$2,$3,$4,$5,$6,$7,$8,$9,$10,$11,$12 " " $13 }'
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.