【问题标题】:Combine several single line text files into a single line text file in Unix在 Unix 中将几个单行文本文件组合成一个单行文本文件
【发布时间】:2020-05-22 22:49:06
【问题描述】:

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

【问题讨论】:

    标签: unix


    【解决方案1】:

    由于您已经将它们放在一个文件中,因此您要查找的 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$
    

    请注意,这也会删除文件的最后一个换行符。

    awk 'ORS="";1' 将从单个文件中执行此操作,但也会删除尾随换行符,因为它将输出记录分隔符设置为空,然后打印它读取的每一行,例如

    $ cat 1.txt 2.txt 3.txt
    1 1 11 1    1
    1 1 11 1 122
    1 1 1     1 1 133
    $ awk 'ORS="";1' 1.txt 2.txt 3.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 适用于 condition? {code} 之类的代码块 默认行为是 print 如果块不存在,所以这个 是写{print} 的简单方法。请注意,ORS="" 充当 一个块上的条件语句,虽然在这种情况下 什么都没有的分配被视为错误,所以除了 正在设置的 ORS。这就是为什么当我们将其更改为类似 ORS="|"我们可以去掉1,因为ORS赋值了一个值 被认为是真的,并且会执行{print}的默认行为

    • END{print"\n"} - 以 END 开头的块仅在之后执行 读取所有文件的所有行,因此这会添加回尾行 我们通过更改 ORS 删除了 feed。

    【讨论】:

    • 感谢 zzevannn,我使用了 nawk 'ORS="";1;END{print"\n"}' 因为我的 awk 不起作用。您介意解释一下 'ORS="";1' 是什么意思吗?
    • @pat - 为答案添加了一些解释,希望对您有所帮助。如果这对您有用,请不要忘记投票并接受
    【解决方案2】:

    我刚试过:

    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
    

    【讨论】:

    • 但是,正如 OP 在问题中所说“所有的空间都消失了”——多个空间被折叠成一个空间。
    • @StephenP:我已经编辑了我的答案。似乎有一些意想不到的行为,因为echo $(cat ...) 是正确的方法。
    • 嗨@Dominique - 尝试使用包含version = 1.203 行的文件,其中等号两边各有4 个空格。 (哈哈哈这个评论中没有保留空格,即使它是反引号)。 echo 本身会保留空格,是命令的解释将它们折叠起来;从这个意义上说,这是预期的行为。您需要引用命令以避免这种情况。试试echo "$(cat file1.txt file2.txt file3.txt)"
    • 在echo "*" &gt; test.txt之后测试一下。
    猜你喜欢
    • 1970-01-01
    • 2015-07-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-08
    • 1970-01-01
    相关资源
    最近更新 更多