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
Bash 和格雷普在一起?_Bash_Shell_Awk - Fatal编程技术网

Bash 和格雷普在一起?

Bash 和格雷普在一起?,bash,shell,awk,Bash,Shell,Awk,我有一个如下的csv文件: Monday Tuesday Wednesday Thursday Friday 我想用csv文件分析另一个csv文件,该文件包含一周中的几天。我的脚本将采取星期一,分析文件和提取所有行包含单词星期一,然后切换到星期二等 我使用此命令执行以下操作: grep -wf daysfile.csv myothercsv.csv > file.csv 此命令运行良好,但结果是: Monday XXXX XXX XXX Monday XXXX XXX XXX Mond

我有一个如下的csv文件:

Monday
Tuesday
Wednesday
Thursday
Friday
我想用csv文件分析另一个csv文件,该文件包含一周中的几天。我的脚本将采取星期一,分析文件和提取所有行包含单词星期一,然后切换到星期二等

我使用此命令执行以下操作:

grep -wf daysfile.csv myothercsv.csv > file.csv
此命令运行良好,但结果是:

Monday XXXX XXX XXX
Monday XXXX XXX XXX
Monday XXXX XXX XXX
Monday XXXX XXX XXX
Tuesday XXXX XXXX XXXX
Tuesday XXXX XXXX XXXX
Tuesday XXXX XXXX XXXX
Tuesday XXXX XXXX XXXX
Tuesday XXXX XXXX XXXX
Wednesday XXXX XXXX XXXX
Wednesday XXXX XXXX XXXX
Wednesday XXXX XXXX XXXX
Wednesday XXXX XXXX XXXX
但我希望有这样的空间:

Monday XXXX XXX XXX
Monday XXXX XXX XXX
Monday XXXX XXX XXX
Monday XXXX XXX XXX

Tuesday XXXX XXXX XXXX
Tuesday XXXX XXXX XXXX
Tuesday XXXX XXXX XXXX
Tuesday XXXX XXXX XXXX

你能帮我吗?

只要把grep的输出传送到

perl -ape 'print "\n" if $previous and $previous ne $F[0]; $previous = $F[0]'
  • -p
    逐行读取输入,并在处理后打印每一行
  • -a
    将每个输入行拆分为@F数组

    • awk
      中,请尝试以下内容

      your_grep_command | awk 'prev!=$1 && prev{print ""} {prev=$1;print}' 
      


      由于OP未提供示例,因此无法测试它,请尝试直接运行此命令好吗?尽管将
      grep
      输出传递给另一个命令一次,然后通知我们

      awk 'FNR==NR{a[$0];next} prev!=$1{print ""} ($0 in a);{prev=$1}'  daysfile.csv <(sort -k1 myothercsv.csv)
      
      awk'FNR==NR{a[$0];next}prev=$1{print”“}(a中为0美元);{prev=$1}'daysfile.csvUse
      awk

      grep -wf daysfile.csv myothercsv.csv |awk -F: '{if(f!=$1)print ""; f=$1; print $0;}'
      
      Monday XXXX XXX XXX
      Monday XXXX XXX XXX
      Monday XXXX XXX XXX
      Monday XXXX XXX XXX
      
      Tuesday XXXX XXXX XXXX
      Tuesday XXXX XXXX XXXX
      Tuesday XXXX XXXX XXXX
      Tuesday XXXX XXXX XXXX
      Tuesday XXXX XXXX XXXX
      
      Wednesday XXXX XXXX XXXX
      Wednesday XXXX XXXX XXXX
      Wednesday XXXX XXXX XXXX
      Wednesday XXXX XXXX XXXX
      

      我不确定grep-wf daysfile.csv myothercsv.csv
      如何像您描述的那样为您工作。
      myothercsv.csv
      中的数据必须已按一周中的天数排序,因为grep命令只需按顺序打印
      daysfile.csv
      中有匹配单词的任何行

      如果要按顺序搜索
      daysfile.csv
      中的每个单词,则可能需要以下内容:

      cat daysfile.csv | while read line; do grep "$line" myothercsv.csv; done
      
      然后,您可以将此处的其他答案应用于向输出中添加空行(当检测到不同的第一个单词时)

      另外,另一种方法是在myothercsv文件中插入一个空行,并在daysfile中插入
      ^$
      行。下面是一个示例,请注意myothercsv文件中的第一行是空白的

      $ cat daysfile.csv
      mon
      ^$
      tue
      ^$
      wed
      ^$
      
      $ cat myothercsv.csv
      
      mon,1
      tue,2
      wed,3
      mon,4
      tue,5
      wed,6
      
      $ cat daysfile.csv | while read line; do grep "$line" myothercsv.csv; done
      mon,1
      mon,4
      
      tue,2
      tue,5
      
      wed,3
      wed,6
      

      恕我直言,我不确定OP是否提到了
      是字段分隔符,可能是您正在尝试执行我在这方面所做的操作,您的命令工作得非常好!但它在每一组天之间只增加了一个空格。您能告诉我如何在它们之间放置两个空格吗?将
      print”“
      更改为
      print”\n“
      @Ezzmazz,您能检查一下这个解决方案吗?如果这对您有帮助,请现在告诉我?