一个愚蠢的问题:
我现在拥有的:
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...
答案 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)
鉴于此问题的通用标题,以下是概括的解决方案:
paste
和tr
解决方案仅适用于单字符分隔符。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}}将是一个空格,因此输出时每个后续输入行的前置单个空格。净效果是空间仅在输入行之间插入,但不在末尾 em>。
如果您不想使用尾随换行符,请忽略sep
。
使用 END { printf "\n" }
的简单替代方案,假设尾随空格不是问题:
tr
请注意,不会输出尾随换行符。
如果确实需要删除尾随空格,
GNU tr '\n' ' ' < file
:
head
否则,使用shell参数扩展:
tr '\n' ' ' < file | head -c -1