【问题标题】:AWK -F with print all but last recordAWK -F 打印除最后一条记录以外的所有记录
【发布时间】:2018-12-31 22:47:41
【问题描述】:

/Home/in/test_file.txt

echo  /Home/in/test_file.txt | awk -F'/' '{ print $2,$3 }'

结果如下:

Home in

但结果我需要/Home/in/。我必须得到除test_file.txt之外的所有东西

如何做到这一点?

【问题讨论】:

    标签: bash awk sed


    【解决方案1】:

    将最后一个字段替换为空字符串并
    将斜线放回作为(内置)输出字段分隔符(OFS)

    echo  /Home/in/test_file.txt | awk -F'/' -vOFS='/' '{$NF="";print}
    

    【讨论】:

      【解决方案2】:

      有几种方法可以实现这一点:

      1. 使用dirname

        $ dirname /home/in/test_file.txt
        /home/in
        
      2. 使用 Shell 替换:

        $ var="/home/in/test_file.txt"
        $ echo "${var%/*}"
        /home/in
        
      3. 使用 sed:(参见 Ed Morton)

      4. 使用 AWK:

        $ echo "/home/in/test_file.txt" | awk -F'/' '{OFS=FS;$NF=""}1'
        /home/in/
        

      备注:所有这些都有效,因为您不能使用带有正斜杠的文件名 (Is it possible to use "/" in a filename?)

      注意:如果您只有一个没有路径的文件名,则除了 dirname 之外的所有文件都会失败。而dirname foo 将返回./ 所有其他人将返回foo

      【讨论】:

        【解决方案3】:
        echo  /Home/in/test_file.txt | awk -F'/[^/]*$' '{ print $1 }'
        

        ..将打印除斜杠以外的所有内容

        【讨论】:

          【解决方案4】:
          $ echo '/Home/in/test_file.txt' | awk '{sub("/[^/]+$","")} 1'
          /Home/in
          
          $ echo '/Home/in/test_file.txt' | awk '{sub("[^/]+$","")} 1'
          /Home/in/
          
          $ echo '/Home/in/test_file.txt' | sed 's:/[^/]*$::'
          /Home/in
          
          $ echo '/Home/in/test_file.txt' | sed 's:[^/]*$::'
          /Home/in/
          
          $ dirname '/Home/in/test_file.txt'
          /Home/in
          

          您的尝试 awk -F'/' '{ print $2,$3 }' 没有做您想要的,因为 -F'/' 告诉 awk 将输入拆分为每个 / 的字段,然后 print $2,$3 告诉 awk 打印由分隔的第二个和第三个字段一个空白字符(OFS 的默认值)。你可以这样做:

          $ echo '/Home/in/test_file.txt' | awk 'BEGIN{FS=OFS="/"} { print "",$2,$3,"" }'
          /Home/in/
          

          要获得预期的输出,但这是错误的方法,因为它会删除您不想要的字段并删除输入分隔符,然后添加新的输出分隔符,这些分隔符恰好与输入分隔符具有相同的值,而不是而不是像上面的其他解决方案那样简单地删除您不想要的字段。

          【讨论】:

            【解决方案5】:

            awk 行为正常。

            当您将斜线 / 定义为分隔符时,表达式中的字段将成为分隔符之间的内容

            如果您还需要打印分隔符,则需要明确执行,例如:

            echo /Home/in/test_file.txt | awk -F'/' '{ printf "%s/%s/",$2,$3 }'

            【讨论】: