除首先使用AWK外,打印所有列

时间:2017-09-18 15:31:33

标签: linux bash shell awk

我有一个包含文件列表的文件。该文件看起来像这样

$ cat filelist
  D       src/layouts/PersonAccount-Person Account Layout.layout
  D       src/objects/Case Account-Record List.object

我想先剪切两列并使用目录路径仅打印文件名。此列表是动态的。文件名之间有空格。所以我不能使用空格作为分隔符。如何使用AWK命令获取此信息?

输出应该是这样的

src/layouts/PersonAccount-Person Account Layout.layout
src/objects/Case Account-Record List.object

6 个答案:

答案 0 :(得分:1)

这将完全符合您的示例:

 sed -E 's/(.*)([ ][a-zA-Z0-9]+\/[a-zA-Z0-9]+\/[a-zA-Z0-9. -]+)/\2/g' filelist 

说明:

它匹配你的路径(包括空格,如果有的话),然后用一个匹配替换整行。易腻的柠檬挤压:)

问候!

答案 1 :(得分:1)

一个简单的grep

grep -o '[^[:blank:]]*/.*' filelist

这是零个或多个非空白字符,后跟斜杠,后跟字符串的其余部分。

这与任何没有斜线的行都不匹配

答案 2 :(得分:1)

  

仅打印带有目录路径的文件名

awk 方法:

<li class="razvernut">
    <span class="span"></span>
    <span class="otherspan"></span>
    <a>Show ul.sub-menu with 0 max-height</a>
    <ul class="sub-menu">...</ul>
</li>

输出:

awk '{ sub(/^[[:space:]]*[^[:space:]][[:space:]]+/,"",$0) }1' filelist

<强> ----------

仅提取文件的 basename

src/layouts/PersonAccount-Person Account Layout.layout
src/objects/Case Account-Record List.object

输出:

awk -F'/' '{print $NF}' filelist

答案 3 :(得分:1)

这是一个可移植的POSIX shell解决方案:

public MyClass implements Comparable<MyClass>{
    private static final Comparator<MyClass> NATURAL_ORDER_COMPARATOR =     
        Comparator.comparing(MyClass::getFoo)
                  .thenComparing(MyClass::getBar);

    ...

    public int compareTo(MyClass other){
        return NATURAL_ORDER_COMPARATOR.compare(this, other);
    } 
}

这将遍历给定输入文件的每一行(或标准输入),并打印没有前两个空格或前面存在的文本的行。这并不贪心。

与此处的其他一些答案不同,这将在行的其余部分保留间距(如果有的话)。

如果你想把它作为一个单行:

#!/bin/sh

cat "$@" |while read line; do
  echo "${line#* * }"
done

如果最上面的目录名称以空格开头,则会失败。要解决这个问题,你需要剥离前十个字符(我假设它是静态的):

while read L < filelist; do echo "${L#* * }"; done

作为单行代码,在bash中,可以通过使用子字符串来简化:

#!/bin/sh

cat "$@" |while read line; do
  echo "${line#??????????}"
done

答案 4 :(得分:1)

你可以尝试一次:

bash-4.4$ cat filelist |awk '{$1="";print $0}'
 src/layouts/PersonAccount-Person Account Layout.layout
 src/objects/Case Account-Record List.object   

否则,如果你想删除2列,那就是:

awk '{$1=$2="";print $0}'

这将产生以下输出:

bash-4.4$ cat filelist |awk '{$1=$2="";print $0}'                                                                                                                                   
  Account Layout.layout                                                                                                                                                             
  Account-Record List.object   

答案 5 :(得分:1)

试试这个:

awk -F" " '{$1=""; print $0}' filelist | sed 's/^ //c'

这里sed用于删除输出行的第一个空格。