我有一个包含以下模式的文件,最多 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:
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