我正在尝试使用管道分隔符 ( |
) 数据来 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
再次用于将逗号分隔的数据重新格式化为|
- 分隔的格式。
请注意,仅在需要时或使用csvformat
if 时才向字段添加双引号(在这种情况下,它将对所有字段添加双引号)。-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"
。