Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2012/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash awk sed反向引用csv文件_Bash_Awk_Sed - Fatal编程技术网

Bash awk sed反向引用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

延伸上一个问题的问题。(我更喜欢问新问题,而不是编辑第一个问题。我可能错了)

编辑:好吧,我错了,我应该编辑我的第一个问题。我不好(所以问题是一门艺术,很难掌握)

我有一个csv文件,用半列作为字段分隔符。以下是csv文件的摘录:

。。。;领域(:);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
在一列文件成功时失败。面对这一挑战的最佳工具是什么

  • 用很长的正则表达式sed
  • 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的分隔符
  • 这可能适用于您(GNU-sed):

    寻找一组数字(可能有一个小数点),然后是一对括号,并以所需的方式重新排列它们,在每一行中进行全局排列。

    您的“问题”太长,太杂乱,其中包含了太多单独的问题,需要仔细研究,但下面是如何从任何sed提供的输入中获得所需的输出:

    $ 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;....