awk 合并来自不同输出文件的两列

问题描述 投票:0回答:1

我正在努力组合

git status
git diff -stat
以显示修改类型和行更改。

  • 输出1(来自

    $ git status -sb

    ## main
    M a
    ?? b
    
  • output2(来自

    $ git --no-pager diff --stat | head -n-1
    ,无法显示新文件)

    a | 2 ++
    

预期的最终结果应该是:

## main              # header from output1 NR==1
 M a | 2 ++          # output1 $1 + output2 $0; or output1 $0 + output2 $2,$3
?? b                 # if output1 $2 cannot be found in output2 $1, then print output1 $0

我根据awk要求合并两个文件奋斗了很长时间,但仍然卡住

我从https://stackoverflow.com/a/14984673/2940319https://stackoverflow.com/a/64139395/2940319得到线索,并注意到:

  • FNR == NR
    :读取第一个文件
  • FNR != NR
    :读取第二个文件

所以下面的丑陋代码可以工作:

$ awk 'FNR==NR { map[$1]=$2" "$3" "$4 } FNR != NR { if ($2 in map) {print $0, map[$2]} else { print $0 } }' f2 f1
## main
 M a | 2 ++
?? b

有什么优雅的方式来实现它吗?

如何才能让 git 输出中不包含 ansicolor 呢?是否可以像这样调用

awk
:

$ awk '...' <(git status -sb) <(git --no-pager diff --stat | head -n-1)
bash git awk
1个回答
0
投票

我可以保留 git 输出中的 ansicolor 吗?

ANSI 转义码只是文本的一部分,例如在支持颜色的终端模拟器中

echo -e "\033[31mtest123\033[0m" | awk '{print $0}'

使用红色字符输出

test123
echo -e
代表任何使用ANSI转义码的命令。请记住,您必须考虑到这一点,例如

echo -e "\033[31mtest123\033[0m" | awk '$0=="test123"'

将给出空输出。请注意,当某些命令的输出被推入管道时,它们会自动脱离颜色代码,例如 GNU

grep

grep -o '[0-9]' file.txt

将从

file.txt
输出彩色数字,同时

grep -o '[0-9]' file.txt | awk '{print $0}'

将给出相同的数字,但不着色。我不知道

git
是否确实有这种行为,但在你进一步之前,我建议召唤能够告诉你这一点的
git
忍者。

© www.soinside.com 2019 - 2024. All rights reserved.