如何在bash中将列表转换为字符串?

时间:2016-04-16 02:01:29

标签: bash list

一个愚蠢的问题:

我现在拥有的:

NA06994.del.vcf
NA07048.del.vcf
NA07056.del.vcf
NA11892.del.vcf
NA11893.del.vcf
NA12003.del.vcf
NA12043.del.vcf

如何变成:

NA06994.del.vcf NA07048.del.vcf NA07056.del.vcf NA11892.del.vcf NA11893.del.vcf...

3 个答案:

答案 0 :(得分:2)

使用awk,您可以将输出记录分隔符ORS设置为空格:

awk -v ORS=' ' '1' file

默认情况下,输入记录分隔符是换行符。当您使用ORS时,这会被awk删除并替换为print(默认情况下换行)。脚本1是最短的 true 条件,触发默认操作{ print }

这比使用echo cat略长,但这种方法有很多优点。

首先,保留文件中的空白区域。这是因为当您将cat的结果传递给echo时,它只会将文件中的单词视为参数列表,它以单个空格分隔打印。

其次,您的文件中没有特殊字符的问题,例如*,在传递给echo之前,它将由shell进行全局扩展。

第三,这一切都发生在一个过程中,而不是使用子shell。

答案 1 :(得分:0)

让我们说名为a的文件包含以下内容:

NA06994.del.vcf
NA07048.del.vcf
NA07056.del.vcf
NA11892.del.vcf
NA11893.del.vcf
NA12003.del.vcf
NA12043.del.vcf

然后,bash中的这个命令会做你想要的:

echo `cat a`

将导致此输出:

NA06994.del.vcf NA07048.del.vcf NA07056.del.vcf NA11892.del.vcf NA11893.del.vcf NA12003.del.vcf NA12043.del.vcf

答案 2 :(得分:0)

鉴于此问题的通用标题,以下是概括的解决方案:

  • pastetr解决方案仅适用于单字符分隔符。
  • awk解决方案可以使用任何字符序列(字符串)

This answer指向最简单的解决方案,它也避免了尾随空格:paste -s

paste -sd ' ' file
  • -d ' '告诉paste使用单个空格作为分隔符(分隔符)

  • -s使用指定的分隔符行之间连接输入文件的行,但不是在最后一行之后。

awk 解决方案避免输出中的尾随空格

awk '{ printf "%s%s", sep, $0 } NR==1 { sep = " " } END { printf "\n" }' file

(这些命令也可以没有 NR==1,但效率较低,尽管在现实世界中可能无关紧要:
awk '{ printf "%s%s", sep, $0; sep = " " }' file

  • awk中的未初始化变量默认为字符串上下文中的空字符串,因此sep最初为空。
    • 因此,对于第一个行,字符串连接sep $0实际上与输入行$0相同。
  • 如果当前行号(NR==1 { sep = " " })为1,则
  • sep将变量NR设置为单个空格。因此,从第2行开始,{ {1}}将是一个空格,因此输出时每个后续输入行的前置单个空格。

净效果是空间仅在输入行之间插入,但不在末尾
如果您不想使用尾随换行符,请忽略sep

使用 END { printf "\n" } 的简单替代方案,假设尾随空格不是问题

tr

请注意,不会输出尾随换行符。

如果确实需要删除尾随空格,

  • GNU tr '\n' ' ' < file

    head

  • 否则,使用shell参数扩展:

    tr '\n' ' ' < file | head -c -1