Bash awk sed反向引用csv文件
延伸上一个问题的问题。(我更喜欢问新问题,而不是编辑第一个问题。我可能错了) 编辑:好吧,我错了,我应该编辑我的第一个问题。我不好(所以问题是一门艺术,很难掌握) 我有一个csv文件,用半列作为字段分隔符。以下是csv文件的摘录:Bash awk sed反向引用csv文件,bash,awk,sed,Bash,Awk,Sed,延伸上一个问题的问题。(我更喜欢问新问题,而不是编辑第一个问题。我可能错了) 编辑:好吧,我错了,我应该编辑我的第一个问题。我不好(所以问题是一门艺术,很难掌握) 我有一个csv文件,用半列作为字段分隔符。以下是csv文件的摘录: 。。。;领域(:);10000(n,d);(:);领域 ...;领域123.12(b);123(a);123.00(:);.... 以下是所需的输出: 。。。;领域(:);(d)10000;(:);领域 ...;领域(b) 123.12;(a) 123;(:) 12
。。。;领域(:);10000(n,d);(:);领域
...;领域123.12(b);123(a);123.00(:);....
以下是所需的输出:
。。。;领域(:);(d)10000;(:);领域
...;领域(b) 123.12;(a) 123;(:) 123.00;....
我搜索一个解决方案,在每个字段中交换2个模式
模式1:任意数字,带可选小数点(.)和可选小数位数
e、 g:1/1111.00/444.3/32/32.66666/1.0/
模式2:任何以左括号开始,后跟一个或多个字符,以右括号结束的字符串
e、 g:(n,a,p)/(:)/(llll)/(d)/(123)/(1;2;3)
第一个问题中提供的解决方案适用于只包含一列的简单文件。如果我在csv文件中尝试解决方案,我将面临多个失败
所以我尝试了类似的解决方案,它(我认为)更“面向列”
我试过了
awk -F";" '{print gensub(/([[:digit:].]*)(\(.*\))/, "\\2 \\1", "g")}' file
我认为通过修正字段分隔符(;),我的正则表达式交换将在每个字段中成功。这是一个错误
这是一个失败的例子
;(:);7320000(n,d);(:)
所需输出-->;(:);(d)7320000;(:)
我的问题(最后):为什么awk
在一列文件成功时失败。面对这一挑战的最佳工具是什么
我知道我不清楚。我有两个问题(英语、技术限制)。抱歉。嗯,当解析没有任何引用值的简单删除文件时,通常awk会帮助您:
awk -vFS=';' -vOFS=';' '{
for (i = 1; i < NF; i++) {
split($i, t, "(")
if (length(t[1]) != 0 && length(t[2]) != 0) {
$i="("t[2]" "t[1]
}
}
print
}' <<EOF
...;field;(:);10000(n,d);(:);field;....
...;field;123.12(b);123(a);123.00(:);....
EOF
代码>我做一个换行
之前至少用on字符替换字符串(
和中的一个字符串)
合并了7行代码>作为带有xargs和printf的分隔符
$ sed 's/\([0-9][0-9.]*\)\(([^)]*)\)/\2 \1/g' file
...;field;(:);(n,d) 10000;(:);field;....
...;field;(b) 123.12;(a) 123;(:) 123.00;....
如果你想问一个新问题,请确保它是完整的。请你的问题切中要害,先生,你的问题不清楚。因此,尝试通过添加更多详细信息来编辑它。
;(:);7320000(北、东);(;)
请发布输入文件的格式或发布输入文件中具有代表性的部分。执行代码>,:
(
)
,
是否更改或正在使用测力仪?输出之间有什么变化?允许的字符集是什么?很难猜测正则表达式是否与未知格式匹配。此格式不同于11111.111(n)
。如果您仅按行工作,sed
可能是最简单的解决方案,如果您需要ex.sum列(而不是仅按行工作),则会出现awk
。在您的“失败示例”中,将分号改为冒号是否是故意的?(在最后一对括号中)我编辑了我的问题。我希望我的职位具有代表性。我的csv文件使用半列作为字段分隔符。所有其他字符都不是字段分隔符。在每个字段中,csv文件(理论上)可以包含每个字符:coma、单引号或双引号、。。。但没有半柱,否则会有双引号。好了,我停下来,我越来越不清楚了…:(谢谢。那么,对于可能嵌入字段分隔符的带引号字符串的csv文件,您有何建议?这可能会对我有所帮助,因为我也使用这种类型的文件。我建议使用一个支持csv的工具,用分隔符替换不可读的字符(例如\x01
或\xfa
)使用csvtool
或类似工具,然后按正常方式解析,然后替换回分隔符。谢谢@EdMorton,我不知道!)
sed -r 's/([0-9]+(\.[0-9]+)?)(\([^)]*\))/\3 \1/g' file
$ sed 's/\([0-9][0-9.]*\)\(([^)]*)\)/\2 \1/g' file
...;field;(:);(n,d) 10000;(:);field;....
...;field;(b) 123.12;(a) 123;(:) 123.00;....