如何在其他两列输出之间插入一列?

如何在其他两列输出之间插入一列?

请注意,我知道但他们没有帮助我。

我想合并两个命令的输出。

ls -1sh

wc -l

所以我可以做类似的事情:

<combined command> o.img 1.img
  1512 412K 0.png
  1269 320K 1.png
  2781 732K total

还有一个小问题是 ls 不包括大小之和。

答案1

ls不会产生总数,但du可以

du -sch *.csv
16K     LdevInfo.csv
8.0K    LunInfo.csv
4.0K    W.csv
4.0K    WwnInfo.csv
32K     total

wc将总共​​产生

 wc -l *.csv
  101 LdevInfo.csv
   66 LunInfo.csv
   62 W.csv
    8 WwnInfo.csv
  237 total

然后简单地join

join -j 2 -o 1.1,2.1,2.2 v w
101 16K LdevInfo.csv
66 8.0K LunInfo.csv
62 4.0K W.csv
8 4.0K WwnInfo.csv
237 32K total

在哪里

  • -j 2告诉 join 使用字段 2 进行匹配
  • -o 1.1,2.1,2.2打印指定的fileld FILENUM.FIELDNUM

或者,您可以使用额外的 awk 来漂亮地格式化

join -j 2  v w| awk '{printf "%s\t%s\t%s\n",$2,$3,$1}'
101     16K     LdevInfo.csv
66      8.0K    LunInfo.csv
62      4.0K    W.csv
8       4.0K    WwnInfo.csv
237     32K     total

PS:我没有*.png使用过,*.csv但这应该可以。

答案2

首先,您必须使用以下函数修复 ls 不包含总计的问题:

myls() {
    if [ $# -gt 1 ] ; then
        ls -1sh "$@"
        ls -1s "$@" | cut -d' ' -f1 | awk '{s+=$1} END {print s}' | numfmt --to=iec --suffix=' total'
    else
        ls -1sh "$1"
    fi
}

您可以将其放入您的.bashrc并加载它。

之后您必须合并输出。有多种方法可以做到这一点。这是一个:首先用粘贴将所有输出组合起来。不幸的是,粘贴只接受文件作为参数,但您可以使用命名管道来处理:

combined() {
    paste <(wc -l "$@") <(myls "$@") | awk '{print $1, $3, $4}' | sort
}

你可以把这个功能放在你的.bashrcnow.我对它们进行了排序,因为我认为这是模式可读的。| sort如果您不想对它们进行排序,可以将其删除。

如果你不想使用额外的功能,你可以这样做:

myd() {
    if [ $# -gt 1 ] ; then
        tmp=`ls -1sh "$@";ls -1s "$@" | cut -d' ' -f1 | awk '{s+=$1} END {print s}' | numfmt --to=iec --suffix=' total'`
    else
        tmp=`ls -1sh "$1"`
    fi
    paste <(wc -l "$@") <(echo "$tmp") | awk '{print $1, $3, $4}' | sort
}

相关内容