【问题标题】:How to print data between certain tags?如何在某些标签之间打印数据?
【发布时间】:2017-08-14 08:44:08
【问题描述】:

我有一组包含此类数据的文件(数百个)(管道作为列分隔符):

000|FILE___V20170307-003792
102|000|DDKSB=DAGA;DAGA=ADGA;DAG-FGSA=ADGA|0001|KLJDFLKJBDL|00|ADGAHA||00|ASYAHA|||DAGHAH|0|GAFDGA|18||3|N|1||AHA|ASGAN|ASFAN||82|1||2|300|||0|0|0|0|10|0||0|0|KLJDFLKJBDL|2||||||||
102|0100|DDKSB=DAGA;DAGA=ADGA;DAG-FGSA=ADGA|00|KLJDFLKJBDL|00|ASDGAHA||00|ASYAHA|||DAGHAH|0|AGAH|5||3|N|1||AHA|ASGAN|ASDHAH||82|1||2|300|||0|0|0|0|54|0||0|0|KLJDFLKJBDL|2||||||||
010|ENDOFFILE|10

如何只取第一行和最后一行之间的行?第一行的第一列有 000,最后一行的第一列有 010。我尝试使用 awk:

awk '/000/,/010/ { print > "output.txt" }' input_file.txt

但它不起作用,它不检查是否从第一列找到 000 和 010。也许以某种方式省略第一行和最后一行也可以?

【问题讨论】:

标签: bash unix awk sed pattern-matching


【解决方案1】:

你可以使用这个sed:

sed -n '/^000|/,/^010|/{/^0[01]0|/!p;}' file

102|000|DDKSB=DAGA;DAGA=ADGA;DAG-FGSA=ADGA|0001|KLJDFLKJBDL|00|ADGAHA||00|ASYAHA|||DAGHAH|0|GAFDGA|18||3|N|1||AHA|ASGAN|ASFAN||82|1||2|300|||0|0|0|0|10|0||0|0|KLJDFLKJBDL|2||||||||
102|0100|DDKSB=DAGA;DAGA=ADGA;DAG-FGSA=ADGA|00|KLJDFLKJBDL|00|ASDGAHA||00|ASYAHA|||DAGHAH|0|AGAH|5||3|N|1||AHA|ASGAN|ASDHAH||82|1||2|300|||0|0|0|0|54|0||0|0|KLJDFLKJBDL|2||||||||

find 命令中使用:

find . -name '*.txt' -exec sed -i '' -n '/^000|/,/^010|/{/^0[01]0|/!p;}' {} \;

【讨论】:

  • 谢谢,如何替换当前文件中的内容,我试过code find 。 -name '*.txt' -exec sed -n '/^000/,/^010/{/^0[01]0/!p;}' '{}' \;code 但它只是打印结果?
  • 您可以使用:find . -name '*.txt' -exec sed -i '' -n '/^000|/,/^010|/{/^0[01]0|/!p;}' {} \;
【解决方案2】:

你可以试试,

awk -v FS="|" '$1=="000",$1=="010" {print > "output.txt"}' input_file.txt

你明白了,

000|文件___V20170307-003792 102|000|DDKSB=DAGA;DAGA=ADGA;DAG-FGSA=ADGA|0001|KLJDFLKJBDL|00|ADGAHA||00|ASYAHA|||DAGHAH|0|GAFDGA|18||3|N|1||AHA |ASGAN|ASFAN||82|1||2|300|||0|0|0|0|10|0||0|0|KLJDFLKJBDL|2|||||||| 102|0100|DDKSB=DAGA;DAGA=ADGA;DAG-FGSA=ADGA|00|KLJDFLKJBDL|00|ASDGAHA||00|ASYAHA|||DAGHAH|0|AGAH|5||3|N|1||AHA |ASGAN|ASDHAH||82|1||2|300|||0|0|0|0|54|0||0|0|KLJDFLKJBDL|2|||||||| 010|结束文件|10

还有only rows between the first row and the last row

awk -v FS="|" '$1=="010"{f=0} f{print > "output.txt"} $1=="000"{f=1}' input_file.txt

你明白了,

102|000|DDKSB=DAGA;DAGA=ADGA;DAG-FGSA=ADGA|0001|KLJDFLKJBDL|00|ADGAHA||00|ASYAHA|||DAGHAH|0|GAFDGA|18||3|N|1||AHA |ASGAN|ASFAN||82|1||2|300|||0|0|0|0|10|0||0|0|KLJDFLKJBDL|2|||||||| 102|0100|DDKSB=DAGA;DAGA=ADGA;DAG-FGSA=ADGA|00|KLJDFLKJBDL|00|ASDGAHA||00|ASYAHA|||DAGHAH|0|AGAH|5||3|N|1||AHA |ASGAN|ASDHAH||82|1||2|300|||0|0|0|0|54|0||0|0|KLJDFLKJBDL|2||||||||

【讨论】:

    【解决方案3】:

    要在第一行和最后一行之间获取,完全不考虑内容,使用 awk:

    $ awk 'NR>2{print p} {p=$0}' file
    102|000|DDKSB=DAGA;DAGA=ADGA;DAG-FGSA=ADGA|0001|KLJDFLKJBDL|00|ADGAHA||00|ASYAHA|||DAGHAH|0|GAFDGA|18||3|N|1||AHA|ASGAN|ASFAN||82|1||2|300|||0|0|0|0|10|0||0|0|KLJDFLKJBDL|2||||||||
    102|0100|DDKSB=DAGA;DAGA=ADGA;DAG-FGSA=ADGA|00|KLJDFLKJBDL|00|ASDGAHA||00|ASYAHA|||DAGHAH|0|AGAH|5||3|N|1||AHA|ASGAN|ASDHAH||82|1||2|300|||0|0|0|0|54|0||0|0|KLJDFLKJBDL|2||||||||
    

    使用headtail

    $ head -n -1 file |tail -n +2
    

    man head:

       -n, --lines=[-]K
              print the first K lines instead of the first 10; with the 
              leading '-', print all but the last K lines of each file
    

    man tail:

       -n, --lines=K
              output the last K lines, instead of the last 10; or use -n +K to 
              output lines starting with the Kth
    

    如果您有多个文件,您可以:

    for f in files* ; do head -n -1 "$f" |tail -n +2 > newpath/"$f" ; done
    

    【讨论】:

      【解决方案4】:

      使用 sed 的另一种方法:

      sed -n '/^000/,/^010/{//d;p}' file
      
      • /^000/,/^010/:从000 开始的行到010 开始的下一行
      • //d:删除以上地址范围内匹配模式的行
      • p: 输出模式空间

      【讨论】:

        【解决方案5】:

        我会以“类似 C”的方式编写更多内容:

         awk 'BEGIN{ ok = 0; FS = "|" } { if( $1 == "000" && ok == 0 ) { ok = 1; } if( ok == 1 ) { print; } if( $1 == "010" ) { ok = -1; } }' file
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-06-05
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多