AWK -F带有除了最后一条记录以外的所有记录

时间:2018-07-24 10:37:06

标签: bash awk sed

/Home/in/test_file.txt

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

给出的结果为:

Home in

但是我需要/Home/in/作为结果。我必须获得test_file.txt以外的所有内容

如何实现?

6 个答案:

答案 0 :(得分:1)

$ 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/

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

答案 1 :(得分:1)

echo  /Home/in/test_file.txt | awk -F'/[^/]*$' '{ print $1 }'

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

答案 2 :(得分:0)

awk表现正常。

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

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

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

答案 3 :(得分:0)

有几种方法可以做到这一点:

  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

答案 4 :(得分:0)

默认外壳的参数扩展如何?

setOnScrollChangeListener

解决方案2nd: 仅在GNU RecyclerView中进行了测试。

val="/Home/in/test_file.txt"
echo "${val%/*}"
/Home/in

解决方案3: awk中使用echo "/Home/in/test_file.txt" | awk 'BEGIN{FS=OFS="/"} {NF--}1'

match

解决方案4: 使用awk

echo  "/Home/in/test_file.txt" | awk 'match($0,/\/.*\//){print substr($0,RSTART,RLENGTH-1)}'

答案 5 :(得分:0)

用空字符串替换最后一个字段,
将斜杠放回(内置)输出字段分隔符(OFS)

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