将文本文件重新格式化为一行字符串[重复]
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' '|' < file
就足够了。此外,这在副本中的回答完全相同。此外,这两种解决方案都存在最后缺少新行的问题。
@fedorqui 谢谢。换行符可以像这样awk -v ORS=\| '$1=$1 END print RS' file
固定在awk
上,但它仍然会提供额外的不需要的|
tr 版本的末尾多了一个竖线 --- 不知道是不是问题。
换行符可以通过在后面回显来修复。 tr '\n' '|' < 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>1?"|"$0:$0)' test;echo
还删除了不应该存在的第一个栏。以上是关于将文本文件重新格式化为一行字符串[重复]的主要内容,如果未能解决你的问题,请参考以下文章
如何使用for循环将文本文件中的一行字符串作为Bash中另一个脚本的单独变量传递[重复]