Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Unix中将多个单行文本文件合并为一个单行文本文件_Unix - Fatal编程技术网

在Unix中将多个单行文本文件合并为一个单行文本文件

在Unix中将多个单行文本文件合并为一个单行文本文件,unix,Unix,我有三个单行文本文件foo1.txt、foo2.txt和foo3.txt。在我使用cat foo1.txt foo2.txt foo3.txt>foo.txt之后,foo.txt包含我不想要的三行,我想要从每个文件中加入一行。 我尝试了cat foo.txt | sed的/\n//g'>new.txt,但new.txt与foo.txt完全相同。 我尝试了tr'\n'new.txt,同样,new.txt与foo.txt相同。 我尝试了粘贴-sd“\0”foo1.txt foo2.txt foo3.

我有三个单行文本文件foo1.txt、foo2.txt和foo3.txt。在我使用cat foo1.txt foo2.txt foo3.txt>foo.txt之后,foo.txt包含我不想要的三行,我想要从每个文件中加入一行。
我尝试了cat foo.txt | sed的/\n//g'>new.txt,但new.txt与foo.txt完全相同。
我尝试了
tr'\n'new.txt
,同样,new.txt与foo.txt相同。
我尝试了粘贴-sd“\0”foo1.txt foo2.txt foo3.txt>foo.txt,但是foo.txt仍然包含三行。
我尝试了
echo$(cat foo1.txt foo2.txt foo3.txt)>foo.txt
,虽然foo.txt只包含一行,但所有空格都消失了。
有什么建议吗?

我刚试过:

echo $(cat file1.txt file2.txt file3.txt)
这似乎删除了文件输出之间的行尾

关于你的空间消失,我没有这种行为:

Prompt> cat test.txt
version = 1.203 
Prompt> echo $(cat test.txt test.txt test.txt)
version = 1.203 version = 1.203 version = 1.203

因为您已经在一个文件中找到了它们,所以您要查找的
tr
tr-d'\n'

$ cat foo.txt
1 1 11 1    1
1 1 11 1 122
1 1 1     1 1 133
$tr -d '\n' < foo.txt > new.txt
$ cat new.txt
1 1 11 1    11 1 11 1 1221 1 1     1 1 133$
注意,我的终端就在那里的末端。如果需要结束换行符,可以添加
END{print”\n}
,例如

$ awk 'ORS="";1;END{print"\n"}' 1.txt 2.txt 3.txt
1 1 11 1    11 1 11 1 1221 1 1     1 1 133
$
如果你想在每个文件的行之间留一个空格或什么东西,你可以将ORS设置为任意值并删除1,但是这会留下一个尾随字符,所以你必须将它交换回换行符,例如

$ awk 'ORS="|"' 1.txt 2.txt 3.txt | sed 's/|$/\n/g'
1 1 11 1    1|1 1 11 1 122|1 1 1     1 1 133
编辑在一条评论中,询问awk命令的实际含义:

  • ORS=”“-设置awk的输出记录分隔符,该分隔符由
    将“\n”默认为“无”。ORS在行之间使用,因此这会导致文件中的行被删除
    排成一行

  • 1-awk在类似
    条件的代码块上工作?{code}
    带有 如果块不存在,则默认行为为打印,因此 是一种编写
    {print}
    的简单方法。请注意,
    ORS=”“
    充当 块上的条件语句,但在本例中 不赋值被认为是错误的,所以除了 正在设置这些参数。这就是为什么当我们把它改成
    ORS=“|”
    我们可以删除1,因为赋值为ORS 被视为true,并将执行
    {print}

  • END{print”\n}
    -以END开头的块仅在 所有文件的所有行都将被读取,因此这将添加回尾随行 我们通过更换喂食器来移除饲料


但是,正如OP在问题“所有空间都消失了”中所说的那样——多个空间被压缩为一个空间。@StephenP:我已经编辑了我的答案。似乎出现了一些意外的行为,因为
echo$(cat…
是正确的选择。Hi@Dominique-尝试使用一个文件,该文件的行
version=1.203
,等号的每一侧有4个空格。(哈哈哈,这篇评论中没有保留空格,尽管它是用背景符号写的)
echo
本身将保留空格,是命令的解释将空格折叠;从这个意义上说,这是预期的行为。您需要引用该命令以避免出现这种情况。尝试
echo“$(cat file1.txt file2.txt file3.txt)”
在Test.txt之后测试它;1.结束{print“\n”},因为我的awk不工作。请您解释一下什么是“ORS=”“;“1”是什么意思?@pat-对答案做了一些解释,希望能有所帮助。如果这对你有效,请不要忘记投票并接受
$ awk 'ORS="|"' 1.txt 2.txt 3.txt | sed 's/|$/\n/g'
1 1 11 1    1|1 1 11 1 122|1 1 1     1 1 133