如何将文本文件中的所有行合并为一行?


28

我想将文本中的所有行合并为一行。我是编码的初学者,尝试边做边学。我花了四个小时试图解决这个问题。我知道有解决此问题的简单方法。这是我一直在尝试的方法。

sed -e'N; s / \ n //'myfile.txt#什么都不做

sed -e:a -e N -e's / \ n / /'-e ta myfile.txt#输出全部弄乱了,我无法弄清语法的首尾

猫myfile.txt | tr -d'\ n'> myfile.txt#删除所有行

这是文本文件:

500212
262578-4-4
23200
格里菲斯实验室有限公司
格里菲斯实验室
南都柏林郡议会
办公室
办公室(工业)
列出应税的
2松景工业区
冷杉路
敲门
2007年12月31日
2008年1月1日”   

我不知道哪里出了问题...。

Answers:


31

tr正如您所使用的那样,它应该工作并且最简单-您只需要输出到另一个文件即可。如果将输入文件用作输出,则结果是一个空文件,如您所见;

猫myfile.txt | tr -d'\ n'> oneline.txt

您需要记住一些编辑器以终止行\r\n。在这种情况下,请使用

cat myfile | tr -d '\r\n'

感谢您的帮助,但仍无法正常工作。我知道这是简单而又简单的事情。您提供的命令删除了所有行。我要发布文件500212 262578-4-4 23200 GRIFFITH LABORATORIES LTD GRIFFITH LABORATORIES南都柏林县议会办公厅(工业)列表评分应缴纳2 Pineview工业区Firhouse路Knocklyon 2007年12月31日
John

@JOhn:结果或错误是什么?
ish 2012年

我打算通过编辑答案来发布。使用命令后,文件为空。在终端“ cat reval_details.asp?Pno = 500211.txt | tr -d'\ n'> reval_details.asp?Pno = 500211.txt”中看起来像这样。再次感谢。
约翰

@John:您不能使用相同的输出文件名!(请参阅答案)。请尝试cat reval_details.asp?Pno=500211.txt | tr -d '\n' > new_reval_details.asp?Pno=500211.txt
ish 2012年

1
更好的方法是tr -d '\n' <input.txt > output.txt-避免不必要地使用cat,并减少一条不必要的管道。
evilsoup 2013年

8

这里是。这是另一个解决方案,简单易行。

echo $(cat Input.txt) > Output.txt

2
我不敢相信这
行得通

echo `cat Input.txt` > Output.txt 也可以工作,只是另一个
变种

如果单个分区中有多个空格(空格,制表符,换行符等),它们将被一个空格代替。
iBug

这是一个不错的解决方案,但是在我的计算机上,我发现它的使用时间大约是该tr解决方案的三倍。
LS

3

简单方法

使用awk的另一种方法

cat myfile.txt | awk '{print}' ORS=''

输出:

500212262578-4-423200GRIFFITH LABORATORIES LTDGRIFFITH LABORATORIES南都柏林县议会办公厅(工业)列出应课税率2 Pineview工业区Firhouse RoadKnocklyon 2007年12月31日2008年1月1日”

注意:

ORS ='' ->这是您的字段分隔符,您可以在单引号之间使用任何字符作为字段分隔符。使用此awk方法,我们可以包含空格和所有字符。

希望这会有所帮助!


1
ORS是输出记录分隔符。OFS是输出字段分隔符。参见thegeekstuff.com/2010/01/…man awk
Elder Geek

3

无需将标签:a放在主要说明之外,也不-e需要该选项。最后,/$/是多余的(每行都有EOL字符)。

改善其他答案,一个得到

sed -i ':a; N; s/\n/ /; ta' file

如果编写如下,则更清楚,

sed -i ':a
        N
        s/\n/ /
        ta' file

该命令的工作方式如下:

  1. N 将下一行追加到(多行)模式空间中,该空间已经包含当前行;
  2. s/\n/ /替代换行符\n通过产生N具有空间;
  3. ta:a 只要步骤2中的替换成功,就转到标签后面的脚本行,即,如果替换发生,则执行跳转到步骤1,而不会“命中”脚本的末尾, 读取另一行输入。

请注意以下内容;

  • sed从第一行开始依次读取输入文件的行
  • :a 只是一个标签,而不是要执行的命令;
  • N 原则上可以在任何行上执行,但是
  • s/\n/ /(原则上在任何一行执行)在除最后一行之外的任何一行都成功,因此
  • ta仅当读取输入的最后一行(唯一s失败的行)时,才使脚本的结尾可访问
  • 没有进一步的输入行读入模式空间之后一日一读进去,除非最后一个在读,但随后没有进一步的行读取,并且隐p正在执行的命令。

因此,脚本基本上读取了输入的第一行,并且每次将换行符替换为空格后,都会继续逐行追加以下几行;后最后一行附加(和\n在一个空间变化),N不能追加任何线,s发生故障时,ta是跳过,达到脚本的端部,并隐含pRINT语句在当前looong 1列图案空间执行。

-i选项file用整个1行模式空间替换输入文件。


2

编辑:

搜索并替换\n为空格“”。
您可以转到“搜索”->“替换”
或通过快捷键Ctrl+ 来获取替换窗口H

请参见下面的屏幕截图:

您的原始文本在第1-14行。
结果在第16行。

在此处输入图片说明




0

我认为您只是忘记了需要告诉sed将yourfile.txt的输出重定向到所需的结果newfile.txt。这似乎是你所需要的命令,但只有当你试图合并这些文件都没有太大的sed的缓冲区:sed -e :a -e N -e 's/\n/ /' -e ta yourfile.txt >newfile.txt。感谢这里的另一个论坛,他们其中讨论sed的功能。我已经测试了命令,它对我有用。


1
事实上,sed的-i开关将修改原文件内联,因此没有必要输出到另一个文件。不过要小心!
ish 2012年

我试过sed -e:a -e N -e's / \ n / /'-e ta reval_details.asp?Pno = 500214.txt 2008年1月1日addustrial Estate sed -i:a -e N -e's / \ n / /'-e ta reval_details.asp?Pno = 500214.txt sed:找不到跳转到a'sed的标签a' sed -i :a -e N -i 's/\n/ /' -e ta reval_details.asp?Pno=500214.txt sed: can't find label for jump to -e:a -e N -i's / \ n / /'-e ta reval_details .asp?Pno = 500214.txt sed:无法读取s / \ n / /:没有此类文件或目录#任何提示。
约翰

@Mik我仍然没有运气,但感谢您的答复。
约翰

我将您的文本复制并粘贴到文本编辑器中,然后保存文件,然后使用sed命令,当在nano中打开它时,它们全部显示在一行上;但是,如果您在终端中使用cat打开文件,则文件将被包裹并且看起来不会只是一行,所以也许就是这种情况。另外,在sed之前不需要a',我想您已经在上面的命令中添加了其他不必要的元素,因此请尝试sed -e:a -e N -e's / \ n / /'-e ta yourfile.txt> newfile.txt该行太长了,它将显示在屏幕上,但是,除非您有30英寸以上的显示器!

@Mik干杯的职位。我将数据输入到文本编辑器中保存并运行'sed -e:a -e N -e's / \ n / /'-e ta abc.txt> abc1.txt',它可以正常工作。完美。哈利路亚。然后我输入'sed -e:a -e N -e's / \ n / /'-e ta reval_details.asp?Pno = 500215.txt> Pno = 500215.txt',除第一行外的每一行都有一个在行的开头添加了空格。我感谢您付出的努力,但我想我将继续进行八度尝试并尝试在那里处理数据。
约翰

0

纯bash解决方案:

while read i; do printf '%s ' "$i"; done < file.txt > outfile.txt

0

如果是我,我会在vim中打开它,然后按Shift+ J几次。



0

Python方法:

python -c "import sys; print(' '.join([ l.strip() for l in sys.stdin.readlines() ]))" < input.txt

AWK:

awk '{printf "%s ",$0}' /etc/passwd  
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.