如何将三行合并为一组

如何将三行合并为一组

我有一个包含以下模式的文件,最多 2000 行。对于每组三行,该模式以不同的数值重复,但开头的文本值直到文件末尾都是通用的。

这里我需要合并三行

输入如下

ABC 1223334
Days 344678544324677
Base 45666
ABC 1234565
Days 234567899765443
Base 456643

需要输出看起来像

ABC 1223334 Days 344678544324677 Base 45666
ABC 1234565 Days 234567899765443 Base 456643

答案1

这假设输入是 Unix 文本格式。如果您正在使用 DOS/Windows 文本格式文件,请首先使用例如dos2unix.

对于制表符分隔的输出:

$ paste - - - <file
ABC 1223334     Days 344678544324677    Base 45666
ABC 1234565     Days 234567899765443    Base 456643

对于空格分隔的输出:

$ paste -d ' ' - - - <file
ABC 1223334 Days 344678544324677 Base 45666
ABC 1234565 Days 234567899765443 Base 456643

paste命令与三个破折号一起使用时(如上所示)会创建三列输出,其中每列都是从输入中的一行读取的。默认情况下,列由制表符或用作选项参数的任何字符分隔-d

答案2

像这样使用

awk '{if (NR % 3 == 0) {print}else{printf "%s ", $0}}' file
ABC 1223334 Days 344678544324677 Base 45666
ABC 1234565 Days 234567899765443 Base 456643

答案3

这里不是假设所有记录都有 3 行,而是当第一个字段与第一条记录中的第一个字段匹配时,您可以确定前一条记录已满:

awk '
  {
    if (NR == 1)
      first = $1 ""
    else if ($1 == first)
      sep = ORS
    else
      sep = OFS
    printf "%s", sep $0
  }
  END {if (NR) printf "%s", ORS}'

答案4

使用简单的 shell 循环,

while IFS= read -r a && IFS= read -r b && IFS= read -r c
do
    printf "%s %s %s\n" "$a" "$b" "$c"
done

输出

ABC 1223334 Days 344678544324677 Base 45666
ABC 1234565 Days 234567899765443 Base 456643

相关内容