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