使用 awk 命令查找并替换 Pipe

使用 awk 命令查找并替换 Pipe

我正在尝试使用管道分隔符 ( |) 数据来 grep 第 7 列,因为我必须|从文本中间删除管道 ( )。

样本文件:

col1|col2|col3|col4|col5|col6|col7|col8|col9|col10
value1|value2|value3|value4|value5|value6|"value7|text"|value8|value9|value10

第七栏的问题:我必须|从文本中间删除。value7|text

第 7 列所需的输出为:value7 text

现在我正在尝试编写转到第 7 列的 awk 命令,将 ( |) 管道替换为空白,以便我可以将其视为单个字符串以使我的进程正常工作。

最终输出应该是这样的:

col1|col2|col3|col4|col5|col6|col7|col8|col9|col10
value1|value2|value3|value4|value5|value6|"value7 text"|value8|value9|value10

请建议。

谢谢,

答案1

由于数据似乎是格式正确的 CSV 数据,因此我们可以使用 CSV 解析器:

$ csvformat -d '|' file | tr '|' ' ' | csvformat -D '|'
col1|col2|col3|col4|col5|col6|col7|col8|col9|col10
value1|value2|value3|value4|value5|value6|value7 text|value8|value9|value10

这使用csvformat来自csvkit|- 分隔的数据重新格式化为逗号分隔的数据。 tr然后用空格替换所有剩余的管道符号。最后,csvformat再次用于将逗号分隔的数据重新格式化为|- 分隔的格式。

请注意,仅在需要时或使用csvformatif 时才向字段添加双引号(在这种情况下,它将对所有字段添加双引号)。-U 1

答案2

使用下面的 awk 命令进行测试,效果很好

awk -F '"' '{gsub(/\|/," ",$2);print $0}' filename

输出

col1|col2|col3|col4|col5|col6|col7|col8|col9|col10
value1|value2|value3|value4|value5|value6| value7 text |value8|value9|value10

答案3

尝试这个,

sed 's/\(".*\)|\(.*"\)/\1 \2/g' file

免责声明:我不建议这样做。而是修复您的流程以使其正常工作,而不是引入像这样的丑陋的解决方法。您的数据是普通的 CSV(或“PSV”),任何适当的 CSV 解析器都可以轻松读取。

如果您有一个像这样的字段,这将会出现问题:value\"6|"value7|test"

相关内容