我这里有一个不寻常的. 我们有一个带有标题的竖线分隔文件,但在第9个字段(获取用户输入)中,我们偶尔可以看到用户输入竖线符号. 这会将文件的格式完全抛出窗口,因为管道符号的数量现在与标题不匹配. 例如,如下所示--这是EVNT_MSSG标题下的第5个条目:

IDS|STG   |STT|WRKLST  |AR|CD   |DT    |INDX|EVNT_MSSG                                |EVNT_SRC|EVNT_TM |TYP|DATE    |USR_ID|IDS_APP
1  |ENRICH|Inc|complete|14|BM404|202302|15  |This is some text                        |Operator|10:33:13|0  |20230220|admin |3177098
2  |ENRICH|Inc|complete|15|BM501|202302|16  |This is some more                        |Operator|10:33:13|0  |20230220|admin |3177098
3  |ENRICH|Inc|complete|16|BM502|202302|17  |This bit is all good                     |Operator|10:33:13|0  |20230220|admin |3177098
4  |ENRICH|Inc|complete|17|BM551|202302|18  |Yet more text                            |Operator|10:33:13|0  |20230220|admin |3177098
5  |ENRICH|Inc|complete|18|EM002|202302|19  |problem here | pipes | not needed | Call |Operator|10:33:14|0  |20230220|admin |3177098
6  |ENRICH|Inc|complete|19|BM451|202302|20  |This is also fine                        |Operator|10:33:14|0  |20230220|admin |3177098

显然,在源头上改变这一点会导致公司不愿意支付的成本,所以我的任务是想出一个解决方案,在保持其他所有字段不变的情况下,只go 掉第9个字段中的管道符号.

我真倒霉,碰壁了.

我在awk中使用|作为文件分隔符,以拉出第9个字段,即

awk 'BEGIN { FS = "[|]+" } ; { print $9 }'

但管道正在扔掉这一点,因为他们将第一条不需要的管道视为下一个合法的分隔符.我想我可能不得不从一个不同的Angular 来处理这个问题,但我还没有找到最模糊的方向. 在这方面的任何帮助都将受到极大的感谢.

推荐答案

或许这种方法适合呢?

awk 'BEGIN{FS="|"}                                      # set field separator to pipe
     NF == 15 {print}                                   # if number of fields is correct, print the line
     NF > 15 {                                          # if NF is greater than expected i.e. extra pipes in $9
         for (i=1;i<=8; i++) {printf "%s|", $i}         # print the first 8 fields
         for (j=9; j<=(NF-6); j++) {printf "%s", $j}    # print the next N fields without a pipe delimiter
         for (k=(NF-5); k<=NF; k++) {printf "|%s", $k}  # print the last 6 fields
         print ""                                       # print a newline
     }' file

适用于您的示例数据:

IDS|STG   |STT|WRKLST  |AR|CD   |DT    |INDX|EVNT_MSSG                                |EVNT_SRC|EVNT_TM |TYP|DATE    |USR_ID|IDS_APP
1  |ENRICH|Inc|complete|14|BM404|202302|15  |This is some text                        |Operator|10:33:13|0  |20230220|admin |3177098
2  |ENRICH|Inc|complete|15|BM501|202302|16  |This is some more                        |Operator|10:33:13|0  |20230220|admin |3177098
3  |ENRICH|Inc|complete|16|BM502|202302|17  |This bit is all good                     |Operator|10:33:13|0  |20230220|admin |3177098
4  |ENRICH|Inc|complete|17|BM551|202302|18  |Yet more text                            |Operator|10:33:13|0  |20230220|admin |3177098
5  |ENRICH|Inc|complete|18|EM002|202302|19  |problem here   pipes  not needed Call |Operator|10:33:14|0  |20230220|admin |3177098
6  |ENRICH|Inc|complete|19|BM451|202302|20  |This is also fine                        |Operator|10:33:14|0  |20230220|admin |3177098

Linux相关问答推荐

GNC C:关于主要出发点混乱的 idea ?

pci_user_write_config_word在哪里实现?

Azure Linux B1s VM-Jenkins Sever已安装,但主页未打开

使用awk命令将以:分隔的两个文件合并的方法

加载ELF64头文件为什么会导致分段错误?

使用文件名重新打开 linux 管道(仅从一侧)

如何从核心转储中获取线程名称?

用于替换 struct 文档中文本的 Bash 脚本

如何在Linux中将文件的特定行号中的数字乘以2(双)?

ENQCMD 指令的好处和微操作是什么?

优雅地杀死在 Linux 上运行的 .NET Core 守护进程

从Linux中的行尾删除空格

ldconfig 错误:使用 Linux 加载程序时不是符号链接

如何让 cron 每N分钟运行一次,其中 n % 5 == 1?

如何为 Git 命令设置自动完成功能?

ImportError:在 ubuntu 14.04 中没有名为 _io 的模块

如何通过 xmllint 使用 XSD 验证 XML 文件

如何停止 Linux 上的不间断进程?

在 Docker 容器中运行的 JVM 的驻留集大小 (RSS) 和 Java 总提交内存 (NMT) 之间的差异

在linux中根据内容拆分文件