awk - 如何在忽略较少数量的连续行的同时将每块 3 行合并在一起?
问题描述
我有一个像下面这样的文本文件,包含文本块,块是 3 行的倍数或只有 1 行:
AAAAAAAAAAAAA
BBBBBBBBBBBBB
CCCCCCCCCCCCC
DDDDDDDDDDDDD
EEEEEEEEEEEEE
FFFFFFFFFFFFF
GGGGGGGGGGGGG
HHHHHHHHHHHHH
IIIIIIIIIIIII
JJJJJJJJJJJJJ
KKKKKKKKKKKKK
LLLLLLLLLLLLL
MMMMMMMMMMMMM
NNNNNNNNNNNNN
OOOOOOOOOOOOO
PPPPPPPPPPPPP
QQQQQQQQQQQQQ
RRRRRRRRRRRRR
SSSSSSSSSSSSS
TTTTTTTTTTTTT
UUUUUUUUUUUUU
VVVVVVVVVVVVV
WWWWWWWWWWWWW
XXXXXXXXXXXXX
YYYYYYYYYYYYY
ZZZZZZZZZZZZZ
1111111111111
我想将 3 个连续行的每个块合并在一起,从块中的第一行开始。我想忽略少于 3 行连续行的行。字符和行的长度总是不同的。(我在示例中使线条大小相同,因此看起来不太难看)。
所以输出将是
AAAAAAAAAAAAA BBBBBBBBBBBBB CCCCCCCCCCCCC
DDDDDDDDDDDDD EEEEEEEEEEEEE FFFFFFFFFFFFF
GGGGGGGGGGGGG
HHHHHHHHHHHHH IIIIIIIIIIIII JJJJJJJJJJJJJ
KKKKKKKKKKKKK
LLLLLLLLLLLLL MMMMMMMMMMMMM NNNNNNNNNNNNN
OOOOOOOOOOOOO PPPPPPPPPPPPP QQQQQQQQQQQQQ
RRRRRRRRRRRRR SSSSSSSSSSSSS TTTTTTTTTTTTT
UUUUUUUUUUUUU
VVVVVVVVVVVVV WWWWWWWWWWWWW XXXXXXXXXXXXX
YYYYYYYYYYYYY ZZZZZZZZZZZZZ 1111111111111
我试过用
xargs -n3
但是我不确定如何忽略奇异线
我怎样才能做到这一点?
解决方案
使用 GNU awk gensub()
:
$ awk -v RS= -v ORS='\n\n' '{$1=$1; print gensub(/(([^ ]+ ){2}[^ ]+) /,"\\1\n","g")}' file
AAAAAAAAAAAAA BBBBBBBBBBBBB CCCCCCCCCCCCC
DDDDDDDDDDDDD EEEEEEEEEEEEE FFFFFFFFFFFFF
GGGGGGGGGGGGG
HHHHHHHHHHHHH IIIIIIIIIIIII JJJJJJJJJJJJJ
KKKKKKKKKKKKK
LLLLLLLLLLLLL MMMMMMMMMMMMM NNNNNNNNNNNNN
OOOOOOOOOOOOO PPPPPPPPPPPPP QQQQQQQQQQQQQ
RRRRRRRRRRRRR SSSSSSSSSSSSS TTTTTTTTTTTTT
UUUUUUUUUUUUU
VVVVVVVVVVVVV WWWWWWWWWWWWW XXXXXXXXXXXXX
YYYYYYYYYYYYY ZZZZZZZZZZZZZ 1111111111111
推荐阅读
- android-studio - 具有不同用户的菜单之间的导航抽屉导航
- .net-core - Actionable Message Card的Input.Date控件根据平台返回不同的结果
- javascript - 如何在 onedit_function 中多次创建“if”和“else if”?
- r - 在网络/生产环境中调用 R——方法比较?
- babeljs - 如何使用 Babel 在 JetBrains File Watcher 中设置输出文件的扩展名和路径?[Linux]
- r - 如何从多个数据集中制作每个数据集中值不一致的矩阵?
- python - 放入循环以及如何重复
- kotlin - Android Studio 找不到我的特定绑定
- flutter - 使用字母列表滚动视图时在卡片之间添加间距
- css - CSS 网格自动填充列