linux 命令合并输出中的重复条目

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

我想改变这个:

dir1 file01
dir1 file02
dir1 file03
dir2 file04
dir2 file05
dir3 file06
dir4 file07
dir4 file08
dir4 file09
dir4 file10

分为以下内容:

dir1 file01 file02 file03
dir2 file04 file05
dir3 file06
dir4 file07 file08 file09 file10

我经常做这种事情,如果 Linux 中还没有一个命令可以做到这一点,我会感到惊讶 - 我只是不知道它是什么或如何搜索它。 你会怎么称呼这个? 我会称其为

coalesce
,但也许这只是我。

无论如何,我可以假设第一列已经排序,但如果没有排序 - 如果

coalesce
在处理输入方面很愚蠢,那也没关系。

I.E.

$ cat <<EOF | coalesce
a 1
a 2
b 3
a 4
EOF

a 1 2
b 3
a 4

理想情况下,此命令还可以选择在单独的行上缩进合并的值。

cat <<EOF | coalesce --level-indent 2
a 1
a 2
a 3
b 4
b 5
b 6
EOF

a
  1 2 3
b
  4 5 6

我想如果它也支持多级按键的话那就太好了。

cat <<EOF | coalesce --level-indent 2
a b 1
a b 2
a b 3
a c 4
a c 5
d b 6
d b 7
d b 8
d c 1
EOF

a
  b
    1 2 3
  c
    4 5
d
  b
    6 7 8
  c
    1

我认为每一行标记都可以被视为合并的“级别”(在该行的前面)和分组在一起的“标记”的组合。

最后,如果标记行可以被视为“所有级别”或“非分组”,那将会很有用。 当与最大数量的级别结合起来合并时,它会产生如下所示的结果。

cat <<EOF | coalesce --level-indent 2 --non-grouping --levels 3
2024-05-25 01:23:45 INFO: Something happened
2024-05-25 01:23:46 INFO: Something happened
2024-05-25 01:23:46 WARN: Something strange happened
2024-05-25 01:23:46 DEBUG: Something typical happened
EOF

2024-05-25
  01:23:45
    INFO: Something happened
  01:23:46
    INFO: Something happened
    WARN: Something strange happened
    DEBUG: Something typical happened

我可能可以使用

awk
编写一些内容,保留前几行中看到的级别,并收集级别更改后要发出的匹配令牌 - 但我希望已经有一个命令可以执行此操作,但我只是不知道.

linux bash shell awk posix
1个回答
0
投票
$ awk '$1 != prev{ printf "%s%s", nl, $1; prev=$1; nl=ORS} {$1=""; printf "%s", $0} END{ printf nl}' file
dir1 file01 file02 file03
dir2 file04 file05
dir3 file06
dir4 file07 file08 file09 file10
© www.soinside.com 2019 - 2024. All rights reserved.