问题描述
专家,我正在尝试替换竖线字符“ |”从管道分隔文件的数据字段中获取。
记录有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
您发表了两次评论不适用于我在上面的评论中粘贴的记录(如果该字段中有*,则会尝试列出当前目录中的所有文件)
这可能是外壳的引用和上下文问题。
考虑:
$ 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 -F\| -v OFS=\| '{ print $1,$2,$3,$4,$5,$6,$7,$8,$9,$10,$11,$12 " " $13 }'