当前位置: 首页>>技术教程>>正文


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

,

问题描述

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


sed -e 'N;s/\n//' myfile.txt #Does nothing

sed -e :a -e N -e 's/\n/ /' -e ta myfile.txt #output all messed up and I can't make head nor tail of the syntax

cat myfile.txt | tr -d '\n' > myfile.txt # Deletes all lines

这是文本文件:


500212
262578-4-4
23200
GRIFFITH LABORATORIES LTD
GRIFFITH LABORATORIES
SOUTH DUBLIN COUNTY COUNCIL
OFFICE
OFFICE (INDUSTRIAL)
List Rateable
2 Pineview Industrial Estate
Firhouse Road
Knocklyon
31 Dec 2007
01 Jan 2008"   

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

最佳方法

您使用过的tr应该可以工作,并且最简单-您只需要输出到另一个文件即可。如果将输入文件用作输出,则观察到的结果是一个空文件;

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

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

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

次佳方法

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

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

第三种方法

简单方法

使用awk的另一种方法

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

输出:

500212262578-4-423200GRIFFITH LABORATORIES LTDGRIFFITH LABORATORIESSOUTH DUBLIN COUNTY COUNCILOFFICEOFFICE (INDUSTRIAL)List Rateable2 Pineview Industrial EstateFirhouse RoadKnocklyon31 Dec 200701 Jan 2008″

注意:

ORS =”-> ORS(输出记录分隔符)。 (即您的字段分隔符),您可以将任意字符in-between都用单引号引起来,并将其用作字段分隔符。使用此awk方法,我们可以包含空格和所有字符。

希望这会有所帮助!

第四种方法

不需要将标签: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. 只要步骤2中的替换成功,ta就会转到标签:a之后的脚本行,即如果发生替换,则执行将跳至步骤1,而无需”hitting”脚本结束,即不读取另一行输入。

请注意以下内容;

  • sed从第一行开始依次读取输入文件的行;

  • :a只是一个标签,而不是要执行的命令;

  • N原则上可以在任何行上执行,但是

  • s/\n/ /(原则上在任何行上执行)在除最后一行之外的任何一行上都是成功的,因此

  • ta仅在读取最后一行输入(s发生故障的唯一行)时才使脚本的结尾可访问

  • 除非读入第一个输入行,否则不会再有其他输入行被读入模式空间,除非最后一个被读入,但随后没有其他行要读入,并且隐式p命令被执行。

因此,脚本基本上读取了输入的第一行,并且每次将换行符替换为空格时,都会一一追加追加以下行;追加最后一行(并且在空格中更改了\n)之后,N无法追加任何行,s失败,ta被跳过,到达脚本的结尾,并且隐含的p rint语句在当前looong上执行1行模式空间。

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

参考资料

本文由Ubuntu问答整理, 博文地址: https://ubuntuqa.com/article/11698.html,未经允许,请勿转载。