【问题标题】:Reformat textfile into one line string [duplicate]将文本文件重新格式化为一行字符串[重复]
【发布时间】:2014-10-01 18:52:34
【问题描述】:

这是我所拥有的示例文件

1321|4
512|2
1056|2
314|16
69|1
239|2
0|0
0|0
0|0
0|0
534|0

但我需要文件格式如下:

1321|4|512|2|1056|2|314|16|69|1|239|2|0|0|0|0|0|0|0|0|534|0

我用 awk 试试运气,但没有得到可用的结果,以前从未使用过,也无法将示例和手册放入工作代码中。我怎样才能实现所需的格式?任何帮助都会很棒。

【问题讨论】:

  • 这或多或少有效,如果我在 Windows 上的记事本中打开它,我有希望的格式,但在所有其他编辑器中它与以前相同,只是多了一个 |在价值观的前面。如果我将其回显到终端或使用 cat 左右,我会得到 |0|0|22 作为输出

标签: linux unix awk sed grep


【解决方案1】:

仅外壳(尽管它确实需要一个子外壳:

read -d '' -r -a lines < file
(IFS=\|; echo "${lines[*]}")

【讨论】:

    【解决方案2】:

    你可以用这个

    sed ':a ; N ;s/\n/|/g ; t a '
    

    说明

     t loop  -- Loop continued until the substitution false or EOF occur .
     N       -- Get the two lines and stored in the pattern space .
    

    N 获取两行并存储在模式空间中,因此具有两行的模式空间像 line1\nline2 然后替换执行像 \n|line1|line2 ,所以模式空间只有一行然后循环继续,然后得到另一行并执行替换。 一旦EOF 建立循环终止并打印模式空间。

    【讨论】:

    • 我认为,当您为您的意图添加一些解释时,这对 OP 和更多访问者会更有帮助。
    • @reporter,我已经更新了我的答案。
    • 谢谢,这或多或少都有效,如果我在 Windows 上的记事本中打开它,我就有希望的格式,但在所有其他编辑器中,它和以前一样,只是多了一个 |在价值观的前面。如果我将其回显到终端或使用 cat 左右,我会得到 |0|0|22 作为输出
    【解决方案3】:

    应该这样做:

    tr '\n' '|' < file; echo
    

    或者这个:

    awk -v ORS=\| '$1=$1 END {print RS}' file
    

    【讨论】:

    • tr '\n' '|' &lt; file 就足够了。此外,这在副本中的回答完全相同。此外,这两种解决方案都存在最后缺少新行的问题。
    • @fedorqui 谢谢。换行符可以像这样awk -v ORS=\| '$1=$1 END {print RS}' file 固定在awk 上,但它仍然会提供额外的不需要的|
    • tr 版本的末尾多了一个竖线 --- 不知道是不是问题。
    • 换行符可以通过在后面回显来修复。 tr '\n' '|' &lt; file; echo
    • @Jidder 感谢您提供信息。它仍然无法修复额外的|,所以我投票给了 Jas :)
    【解决方案4】:

    我不确定 awk 是不是最适合这个钉子的锤子,但是

    awk '{ printf("%s%s", sep, $0); sep = "|" }' sample.txt
    

    应该这样做。

    这里是来自 cmets 的 Jotne 的改进版本,添加了最后一个换行符:

    awk '{ printf("%s%s", sep, $0); sep = "|" } END { print "" }' sample.txt
    

    【讨论】:

    • 添加一个END 部分,这将是完美的。 awk '{printf("%s%s",sep,$0);sep="|"} END {print ""}'
    • 对于我自己的答案来说,更短但没有足够的差异awk '{ printf(NR&gt;1?"|"$0:$0)}' test;echo 还删除了不应该存在的第一个栏。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-19
    • 1970-01-01
    • 2014-11-28
    • 2019-05-03
    相关资源
    最近更新 更多