将文本文件重新格式化为一行字符串[重复]

Posted

技术标签:

【中文标题】将文本文件重新格式化为一行字符串[重复]【英文标题】: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 作为输出 【参考方案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 还删除了不应该存在的第一个栏。

以上是关于将文本文件重新格式化为一行字符串[重复]的主要内容,如果未能解决你的问题,请参考以下文章

xcode swift - 将文本格式化为电话号码[重复]

如何使用for循环将文本文件中的一行字符串作为Bash中另一个脚本的单独变量传递[重复]

由于数字格式为文本,将 Excel 文件读取到 Python 失败

将 TextField 文本格式化为价格

将文本添加到文件的第一行 [重复]

如何通过添加零将文本数据格式化为 6 个字符?