Awk Shell脚本:如何分割行?

Awk Shell脚本:如何分割行?,awk,sed,split,grep,Awk,Sed,Split,Grep,这是我的简历: 我的输入文件如下: /tmp/abc.txt /tmp/cde.txt /tmp/xyz/123.txt 我想在2个文件中获得以下输出: 第一档 /tmp/ /tmp/ /tmp/xyz/ 第二档 abc.txt cde.txt 123.txt 非常感谢通过grep grep -o '.*/' file > file1.txt grep -o '[^/]*$' file > file2.txt */匹配从开始到最后一个/符号的所有字符 [^/]*$匹配任何字

这是我的简历:

我的输入文件如下:

/tmp/abc.txt
/tmp/cde.txt
/tmp/xyz/123.txt
我想在2个文件中获得以下输出:

第一档

/tmp/
/tmp/
/tmp/xyz/
第二档

abc.txt
cde.txt
123.txt
非常感谢通过grep

grep -o '.*/' file > file1.txt
grep -o '[^/]*$' file > file2.txt
  • */
    匹配从开始到最后一个
    /
    符号的所有字符
  • [^/]*$
    匹配任何字符,但不匹配
    /
    的零次或多次
    $
    断言我们在一行的末尾

    • 这里是一个完整的
      awk

      awk -F\/ -vOFS=\/ '{print $NF > "file2";$NF="";print > "file1"}' input
      
      这里我们将输入和输出分隔符设置为
      /

      然后将最后一个字段
      $NF
      打印到
      文件2


      将最后一个字段设置为nothing,然后将其余字段打印到
      文件1

      我知道您已经有了答案,但您可能对以下两个命令感兴趣:

      basename
      dirname
      
      如果它们在您的系统上可用,您将能够通过以下管道获得您想要的:

      cat input | xargs -l dirname > file1
      cat input | xargs -l basename > file2
      
      享受吧


      编辑:根据quantdev的评论修复。接得好

      awk解决方案可能是最好的,但这里有一个纯的
      sed
      解决方案:

      #n sed script to get base and file paths
      h
      s/.*\/\(.*.txt\)/\1/
      w file1
      g
      s/\(.*\)\/.*.txt/\1/
      w file2
      
      注意我们如何使用
      h
      保存缓冲区,以及如何使用write(
      w
      )命令生成输出文件。使用sed还有很多其他方法,但是我喜欢使用多个不同的命令。 要使用它:

      >sed-f sed_脚本测试文件


      下面是另一个使用
      tee


      cat f1.txt | tee>(xargs-n1 dirname>>f2.txt)>(xargs-n1 basename>>f3.txt)和>/dev/random

      删除最后一个字段
      是误导性的,因为您只删除了文本。该字段仍然存在,如果删除该字段,则最后一个
      /
      将消失;do dirname“$a”>>f2.txt;basename“$a”>>f3.txt;完成
      cat input | xargs -l dirname > file1
      cat input | xargs -l basename > file2
      
      #n sed script to get base and file paths
      h
      s/.*\/\(.*.txt\)/\1/
      w file1
      g
      s/\(.*\)\/.*.txt/\1/
      w file2