将两行连续合并为一(也寻求适用于Windows文件的解决方案)

时间:2019-05-22 12:53:07

标签: bash awk sed grep

我想使用外部bash环境(例如Cygwin或MobaXTerm提供的环境)将Windows文本文件中的两行连续合并。

我知道有人问过类似的问题,并且已经准备好解决,但是由于某些原因,它们不适用于我的环境。也许是因为Windows在Windows中添加了bash工具无法识别的一些不可见字符?

以下是我已经尝试过的其他类似问题的解决方案:

awk 'NR%2{a=$0;next}{print a","$0}' test.txt

grep "line"  test.txt |awk 'NR==0{prefix=$0;next} {print prefix, $0}'

sed '$!N;s/\n/,/' test.txt

我正在使用的输入:

first line
second line
third line
fourth line
fifth line
sixth line

预期结果:

first line,second line
third line,fourth line
fifth line,sixth line

到目前为止我尝试过的任何代码的实际结果:

1)

➤ sed '$!N;s/\n/,/' test.txt

,second line

,fourth line

,sixth line

2)

➤ grep "line"  test.txt |awk 'NR==0{prefix=$0;next} {print prefix, $0}'

first line

second line

third line

 fourth line

 fifth line

 sixth line

这里的任何帮助将不胜感激。

4 个答案:

答案 0 :(得分:1)

$ cat -v file
first line^M
second line^M
third line^M
fourth line^M
fifth line^M
sixth line^M

使用GNU awk进行多字符RS:

$ awk -v RS='\r?\n' -v OFS=',' 'NR%2{p=$0; next} {print p, $0}' file
first line,second line
third line,fourth line
fifth line,sixth line

任何awk:

$ awk -v OFS=',' '{sub(/\r$/,"")} NR%2{p=$0; next} {print p, $0}' file
first line,second line
third line,fourth line
fifth line,sixth line

答案 1 :(得分:1)

使用GNU SELECT pg_catalog.set_config('search_path', '', false); -

sed

$: cat in 0 1 2 3 4 5 6 7 8 9 $: sed 'N; s/\r*\n/,/; p; d;' in # no dash-options needed 0,1 2,3 4,5 6,7 8,9 -将下一行添加到当前行
N;-用逗号替换所有CR和换行符
s/\r*\n/,/;-打印结果
p;-删除它,使d;不会自动打印。

相同的输出
sed

这是$: sed -En 'N; s/\r?\n/,/; p;' in 扩展的模式匹配,-E是自动打印。

答案 2 :(得分:0)

一个非常简单的解决方案是使用粘贴:

cat > FILE <<EOF
first line
second line
third line
fourth line
fifth line
sixth line

然后:

▶ paste -d, - - < FILE
first line,second line
third line,fourth line
fifth line,sixth line

进一步的解释:

  • paste实用程序将给定输入文件的相应行串联在一起。如果为任何文件指定了-,则使用STDIN,并且对于-的每个实例,以循环方式一次读取一行。

  • -d,告诉粘贴使用,作为字段分隔符,而不是默认的制表符。

答案 3 :(得分:0)

这是一个awk解决方案

awk 'NR%2==1{x=$0;next}{print x "," $0}' file

输出

first line,second line
third line,fourth line
fifth line,sixth line