Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/16.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/16.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
Regex 如何替换包含“的文本序列”\";在文本文件中_Regex_Bash_Csv_Tr - Fatal编程技术网

Regex 如何替换包含“的文本序列”\";在文本文件中

Regex 如何替换包含“的文本序列”\";在文本文件中,regex,bash,csv,tr,Regex,Bash,Csv,Tr,这听起来可能是重复的,但我不能让它工作 考虑: _=空格 -=减号 particle_little.csv是以下格式的文件: waste line to be deleted __data__data__data _-data__data_-data __data_-data__data 我需要获得particle_std.csv中的标准csv格式,如下所示: data,data,data -data,data,-data data,-data,data 我正在尝试使用tail和tr进行转换

这听起来可能是重复的,但我不能让它工作

考虑:

_=空格
-=减号

particle_little.csv
是以下格式的文件:

waste line to be deleted
__data__data__data
_-data__data_-data
__data_-data__data
我需要获得
particle_std.csv
中的标准csv格式,如下所示:

data,data,data
-data,data,-data
data,-data,data
我正在尝试使用
tail
tr
进行转换,这里我拆分命令:

  • tail-n+2 particle\u little.csv
    删除第一行
  • |tr-s'
    删除重复的空格
  • |tr'/\b\n\b/''\n'
    删除最开始的空格
  • |tr'','
    更改逗号的空格
  • >particle_std.csv
    将其放入输出文件
  • 但是我得到了这个(没有第四步):


    最后,文件很大,所以几乎不可能在编辑器中打开(我知道可能有超级编辑器可以打开)

    您可能应该使用
    sed
    awk
    来实现以下目的:

    sed -e 1d -e 's/^  *//' -e 's/  */,/g'
    
    在Awk中执行此操作的一种方法是:

    awk 'NR == 1 { next }
         { pad=""; for (i = 1; i <= NF; i++) { printf "%s%s", pad, $i; pad="," } print "" }'
    
    开始块设置输出字段分隔符;分配
    $1=$1强制Awk返工输出线;
    打印
    打印它


    我留下了第一个Awk版本,因为它显示了不止一种方法,在某些情况下,这样的方法是有用的。但是对于这个任务,第二个Awk版本更好——更简单、更紧凑(并且与’s同构)。

    我建议您使用Awk:

    $ cat file
    waste line to be deleted
      data  data  data
     -data  data -data
      data -data  data
    $ awk -v OFS=, '{ $1 = $1 } NR > 1' file
    data,data,data
    -data,data,-data
    data,-data,data
    

    该脚本将输出字段分隔符
    OFS
    设置为
    ,并将第一个字段重新分配给自身
    $1=$1
    ,使awk接触每一行(并用逗号替换空格)。打印第一行之后的行,其中
    NR>1
    (默认操作是打印该行)。

    因此,如果我读对了,请忽略不以空格开头的行。把其他的都分开

    我建议
    perl

    perl -lane 'next unless /^\s/; print join ",", @F'; 
    
    这一点在给出时:

    waste line to be deleted
      data  data  data
     -data  data -data
      data -data  data
    
    STDIN
    (或在文件名中指定)上,输出:

    这是因为:

    -l
    剥离换行符(并在每次
    打印后替换换行符)

    -a
    在任何空格上自动分割

    -n
    将其包装在
    中,而(){/code>循环逐行迭代-从功能上讲,它的工作方式与
    sed
    /
    grep
    /
    tr
    类似,并读取
    STDIN
    或指定为args的文件

    -e
    允许指定perl代码段

    在这种情况下:

    • 跳过任何不以
      \s
      或任何空格开头的行
    • 任何其他行,用
      作为分隔符连接由
      -a
      生成的字段(
      @F

    然后,您可以将输出重定向到文件(
    >output.csv
    )或者使用
    -i.bak
    在原地编辑。

    在我看来,你试图使用错误的工具来完成这项工作;有趣的是,它工作得不太好。你是被迫只使用
    tr
    tail
    ?还是你只需要完成这项工作,而这些是第一批出现在手的工具?数据部分有没有是否包含空格?大概不是。我需要获得输出,是的,这些是我发现的第一批工具(因此,我对它们的用法很陌生)顺便说一句,这个文件很大。只要你不想一次把所有的文件都写到内存中,只要你不想写太多的管道,文件就不是问题。零管道最好;一个管道不是大问题;二十个管道可能是问题(它可能仍然是正确的,但通常不是)哦!老兄,这很神奇,同时也让我的解决方案变得有趣…谢谢,你能解释一下你使用的选项吗?我已经更新了我的答案来解释更多,还有什么不清楚的吗?
    perl -lane 'next unless /^\s/; print join ",", @F'; 
    
    waste line to be deleted
      data  data  data
     -data  data -data
      data -data  data
    
    data,data,data
    -data,data,-data
    data,-data,data