代码之家  ›  专栏  ›  技术社区  ›  jackscorrow

如何在通过grep获得的每行末尾附加一个值

  •  1
  • jackscorrow  · 技术社区  · 7 年前

    我有一些CSV文件,我想用grep(或来自终端的其他函数)解析,以提取一些信息。

    * Comment 1
    * Comment line 2 explaining what the following numbers mean
    1000000 ; 3208105 ; 0.18 ; 0.45 ; 0.00015 ; 0.1485 ; 0.03 ; 1 ; 1 ; 5 ; 477003 ; 
    
    * Comment 3
    * Comment 4 explaining the meaning of the following lines
    
    * Comment 5
    0; 706520; p; 30.4983
    1; 20859; p; 57.8
    2; 192814; p; 111.842
    3; 344542; p; 130.543
    4; 54605; p; 131.598
    5; 64746; d; 140.898
    6; 442082; p; 214.11
    7; 546701; p; 249.167
    8; 298394; p; 305.034
    9; 81188; p; 305.034
    .......
    

    每个文件中最多可以有一行,其中第三个字段等于 d 而不是 p 。那么要么有一行包含 d 或者根本没有。

    并在这一行之后附加第一个not注释行的最后一个参数,在本例中为 47703 .

    通过这个,我可以提取包含 从我的每个文件中:

    grep -h -E ' d;' *.csv > output.csv
    

    47703 来自类似示例中的文件:

    grep -v -e "^*" -e " p; " -e " d; " example_file.csv | cut -d \; -f 11
    

    5; 64746; d; 140.898; 47703
    

    我希望对当前目录中的每个CSV文件都有这样一行。

    有办法做到这一点吗?

    2 回复  |  直到 7 年前
        1
  •  2
  •   Thor    7 年前

    这听起来像是一份 sed

    parse.sed

    /^ +$/d                          # Ignore empty lines
    /^[ 0-9;.]+$/h                   # Save first "number-only" line to hold space
    / d; / {                         # Run block on lines containing ' d; '
      G                              # Copy saved line to pattern space
      s/\n.*; ([0-9]+) *; *$/; \1/   # Append the last number on the second line
      p                              # to the first line and print the result
    }
    

    parse.sed (便携式sed)

    # Ignore empty lines
    /^ +$/d                          
    
    # Save first "number-only" line to hold space
    /^[ 0-9;.]+$/h                   
    
    # Run block on lines containing ' d; '
    / d; / {                         
    
      # Copy saved line to pattern space
      G                              
    
      # Append the last number on the second line
      # to the first line and print the result
      s/\n.*; ([0-9]+) *; *$/; \1/   
      p                              
    }
    

    sed -Enf parse.sed infile.csv
    

    输出:

    5; 64746; d; 140.898; 477003 
    

    注意,这假设只有一行包含字符组 [ 0-9;.]

    要在所有本地csv文件上运行此操作,请执行以下操作:

    sed -Enf parse.sed *.csv
    
        2
  •  1
  •   TomáÅ¡ Zahradníček    7 年前

    for f in *.csv ; do value=`grep -v -e "^*" -e " p; " -e " d; " -e '^\s*$' "$f" | cut -d \; -f 11` ; line=`grep -h -E ' d;' "$f" ; echo "$line;$value" ; done

    编辑:(我还添加了 -e '^\s*$'

    这只会回响这样的台词 5; 64746; d; 140.898; 47703

    for f in *.csv ; do value=`grep -v -e "^*" -e " p; " -e " d; " -e '^\s*$' "$f" | cut -d \; -f 11` ; line=`grep -h -E ' d;' "$f" ; echo "$line;$value" > output.csv ; done

    为了便于阅读,请在多行上使用相同的代码:

    for f in *.csv
    do 
        value=`grep -v -e "^*" -e " p; " -e " d; " -e '^\s*$' "$f" | cut -d \; -f 11`
        line=`grep -h -E ' d;' "$f"
        echo "$line;$value"
    done