首页 > 解决方案 > 使用 awk/sed/cut/grep 从文本文件中提取冒号分隔的字段/值

问题描述

我想从文本文件中提取一些成对出现的分隔字段/值,它们可能出现在一行或段落中的任何位置。该文件可能包含几个长或短的段落。我希望输出作为每个文件仅一行或每次出现一行。我已经执行了几个选项,在这些选项中,我设法获得了第一次出现的字段名或第二次出现的字段名,但不能同时获得两者。我可以在一次“通过”中获得 N 字段名,然后我需要为以下与订单相关的问题运行第二个字段名。有什么建议可以在一行命令中完成吗?

Text File 1
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed faucibus orci justo, quis faucibus arcu scelerisque molestie. 
Curabitur :Field1 Value1: lacus at scelerisque :Field2 Value2: aliquam. Aenean mattis elit et magna volutpat, eu finibus justo cursus. 
Etiam non cursus nisi. Donec urna nulla, convallis ut velit sit amet, accumsan faucibus urna. :Field1 Value2: lacinia lectus :Field3 Value2: bibendum ligula dictum gravida. Duis eget metus sed lorem scelerisque varius. 

Text File 2
Duis leo sem, placerat eget :Field3 Value1: volutpat eget, condimentum at odio. Ut iaculis tincidunt massa, in :Field1 Value2: accumsan nulla bibendum quis. Sed tincidunt justo sit amet est bibendum mollis. Fusce gravida nunc a nibh blandit ullamcorper. Aliquam auctor laoreet pellentesque :Field1 Value1:
Quisque tempor ultrices congue.
Mauris feugiat est sed neque malesuada tincidunt. Pellentesque fringilla, nunc vitae porta tempor, mauris felis ultricies eros, ac hendrerit lacus odio et nisi. Vivamus cursus lacinia nunc, a mollis mi hendrerit a. Nunc commodo dui nec iaculis fringilla.

Desired output for Text File 1

FieldName1 Value2 FieldName2 Value2  FieldName1 Value1  FieldName3 Value2

FieldName1 Value2   
FieldName2 Value2
FieldName1 Value1
FieldName3 Value2

Desired output for Text File 2

FieldName3 Value1  FieldName1 Value2  FieldName1 Value1

FieldName3 Value1
FieldName1 Value2
FieldName1 Value1

标签: linuxbashparsingsplit

解决方案


如果您将冒号作为字段分隔符,您会发现占位符是偶数字段:

awk -F: '{for (i=2; i<=NF; i+=2) print $i}' file

会让你大部分时间到达那里。


推荐阅读