gpt4 book ai didi

linux - 从管道分隔文件中的字段查找和替换管道分隔符

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:22:14 25 4
gpt4 key购买 nike

我早些时候遇到过类似的问题,后来我不得不为该问题添加更多范围,但不知道如何编辑它并使其再次生效。这就是我发布新问题的原因。

我的文件是竖线分隔文件。

 NAME | NUM | WEB | LOCATION | CURRENCY | PLACE
ABCD | 04 | GO|OGLE | EUROPE | EURO | PARIS
XYZE | 12 | Y|A|HOO | USA | DOLLAR | SEATTLE
LMNO | 17 | |FACE|B|O|O|K | ASIA | ASIAN DOLLAR | HONGKONG
EDDE | 98 | A||M|AZ|ON| | AFRICA | AF DOLLAR | CAPETOWN

我的文件就这么复杂。我们需要的是去掉“|”来自 WEB 字段的符号,并将其替换为#、$、& 或任何垃圾值。

输出必须是:

NAME | NUM | WEB | LOCATION | CURRENCY | PLACE
ABCD | 04 | GO#OGLE | EUROPE | EURO | PARIS
XYZE | 12 | Y#A#HOO | USA | DOLLAR | SEATTLE
LMNO | 17 | #FACE#B#O#O#K | ASIA | ASIAN DOLLAR | HONGKONG
EDDE | 98 | A##M#AZ#ON# | AFRICA | AF DOLLAR | CAPETOWN

我试过 awk'ing 几个过滤器来清除这个困惑。似乎没有什么能找到圆满的结局。谢谢你!我要感谢几个回答我上一个问题的名字:RomanPerekhrest、Ed Morton、shellter、val rog。

最佳答案

$ cat tst.awk
BEGIN { FS=OFS="|" }
NR==1 { outNf=NF; print; next }
{
end = beg + (NF - outNf) - 1
for (i=1; i<=NF; i++) {
sep = (i>=beg && i<=end ? "#" : OFS)
printf "%s%s", $i, (i<NF ? sep : ORS)
}
}

$ awk -v beg=3 -f tst.awk file
NAME | NUM | WEB | LOCATION | CURRENCY | PLACE
ABCD | 04 | GO#OGLE | EUROPE | EURO | PARIS
XYZE | 12 | Y#A#HOO | USA | DOLLAR | SEATTLE
LMNO | 17 | #FACE#B#O#O#K | ASIA | ASIAN DOLLAR | HONGKONG
EDDE | 98 | A##M#AZ#ON# | AFRICA | AF DOLLAR | CAPETOWN

工作原理:在第一行,要输出的字段数与该行的字段数相同,因此将该数字保存为 outNF。从那时起,任何包含超过 outNF 字段的后续行都有从 beg 开始的 outNF-NF 字段进行组合。所以在循环内部,它在从 1 到 beg 的字段之间使用 OFS,然后从 beg+1 到 beg+(outNF-NF) 它在字段之间使用 # 从该范围内的输入字段创建一个合并的输出字段,然后返回到在字段之间使用 OFS。

关于linux - 从管道分隔文件中的字段查找和替换管道分隔符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45980204/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com