我有一个如下格式的文本文件。第一行是“KEY”,第二行是“VALUE”。

KEY 4048:1736 string
3
KEY 0:1772 string
1
KEY 4192:1349 string
1
KEY 7329:2407 string
2
KEY 0:1774 string
1

我需要这个值和键在同一行。所以输出应该是这样的…

KEY 4048:1736 string 3
KEY 0:1772 string 1
KEY 4192:1349 string 1
KEY 7329:2407 string 2
KEY 0:1774 string 1

如果我可以使用一些分隔符,如$或:

KEY 4048:1736 string , 3

我如何将两条线合并成一条?


当前回答

cat input.txt
KEY 4048:1736 string
3
KEY 0:1772 string
1
KEY 4192:1349 string
1
KEY 7329:2407 string
2
KEY 0:1774 string
1
paste -sd ' \n' input.txt
KEY 4048:1736 string 3
KEY 0:1772 string 1
KEY 4192:1349 string 1
KEY 7329:2407 string 2
KEY 0:1774 string 1
paste -sd ' \n' input.txt | rev | sed 's/ / , /' | rev
KEY 4048:1736 string , 3
KEY 0:1772 string , 1
KEY 4192:1349 string , 1
KEY 7329:2407 string , 2
KEY 0:1774 string , 1

其他回答

nawk '$0 ~ /string$/ {printf "%s ",$0; getline; printf "%s\n", $0}' filename

这读起来是

$0 ~ /string$/  ## matches any lines that end with the word string
printf          ## so print the first line without newline
getline         ## get the next line
printf "%s\n"   ## print the whole line and carriage return

虽然前面的解决方案似乎可以工作,但如果文档中出现一个异常,输出就会支离破碎。下面稍微安全一点。

sed -n '/KEY/{
N
s/\n/ /p
}' somefile.txt

您也可以使用以下vi命令:

:%g/.*/j

sed、awk、grep的替代方案:

xargs -n2 -d'\n'

当您想要连接N行并且只需要以空格分隔的输出时,这是最好的方法。

我最初的答案是xargs -n2,它在单词而不是行上分离。-d (GNU xargs选项)可用于按任何奇异字符分割输入。

与glenn jackman使用粘贴的回答略有不同:如果-d分隔符选项的值包含多个字符,则逐个粘贴这些字符,并结合-s选项在处理相同输入文件时继续这样做。

这意味着我们可以使用任何我们想要的分隔符加上转义序列\n来一次合并两行。

使用逗号:

$ paste -s -d ',\n' infile
KEY 4048:1736 string,3
KEY 0:1772 string,1
KEY 4192:1349 string,1
KEY 7329:2407 string,2
KEY 0:1774 string,1

还有美元符号:

$ paste -s -d '$\n' infile
KEY 4048:1736 string$3
KEY 0:1772 string$1
KEY 4192:1349 string$1
KEY 7329:2407 string$2
KEY 0:1774 string$1

它不能做的是使用由多个字符组成的分隔符。

作为奖励,如果粘贴是POSIX兼容的,这将不会修改文件中最后一行的换行符,因此对于具有奇数行数的输入文件,如

KEY 4048:1736 string
3
KEY 0:1772 string

粘贴不会在最后一行添加分隔字符:

$ paste -s -d ',\n' infile
KEY 4048:1736 string,3
KEY 0:1772 string