如何合并文件中具有固定间隔的行?

Jus*_*ner 4 text-processing

我有一个文件,其内容如下所示:

a1
b1
c1
aa
bb
cc
aaa
bbb
ccc
d1
e1
f1
dd
ee
ff
ddd
eee
fff
g1
h1
i1
gg
hh
ii
ggg
hhh
iii
Run Code Online (Sandbox Code Playgroud)

以固定间隔(在本例中为 3)合并行并获得类似结果的最佳方法是什么:

a1 aa aaa
b1 bb bbb
c1 cc ccc
d1 dd ddd
e1 ee eee
f1 ff fff
g1 gg ggg
h1 hh hhh
i1 ii iii
Run Code Online (Sandbox Code Playgroud)

从输入中获取输出的算法是:

  • 首先我们得到第 1 行,即 a1。
  • 我们知道区间是 3
  • 所以第 1 行、第 (1+3) 行、第 (1+3+3) 行应该在同一行
  • 同样,第 2、5、8 行应该在同一行等。

那些a1aaaaa等只是随机的虚拟文本,它们可以是任何随机字符串。关键是a1aaaaa之间有固定的间隔。

目前我使用 emacs 键盘宏来完成这项任务。但是我想知道是否有更好的方法来解决这个问题。提前致谢。

don*_*sti 11

如果你在gnu/anything 上并且行数是 9 的倍数,你可以运行

split -l9 --filter='pr -3 -s" " -t' infile
Run Code Online (Sandbox Code Playgroud)

这将输入分成九行,每一pr -3 -s" " -t'行都通过管道输送到它的列中......取决于编号。您可能需要使用pr选项-w-l. 有关man更多详细信息,请参阅页面。


Jef*_*ler 6

这是 awk 中的一个简单解决方案,硬编码以三行间隔拉入三组:

{
  if (NR > 1 && (NR % 9) == 0) {
    print a "\n" b "\n" c " " $0
    a=""
    b=""
    c=""
  } else if (NR % 3 == 1) {
    if (NR % 9 > 1) {
      a=a" "$0
    } else {
      a=$0
    }
  } else if (NR % 3 == 2) {
    if (NR % 9 > 2) {
      b=b" "$0
    } else {
      b=$0
    }
  } else {
    if (NR % 9 > 3) {
      c=c" "$0
    } else {
      c=$0
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

将其保存到文件中并运行awk -f thatfile < input. 我确信有更聪明的方法可以做到这一点,但我并不是每天都在 awk 中工作。