![](/img/trans.png)
[英]Bash: how to turn list of unique no data values into variables that can be used?
[英]How to turn list into string in bash?
一個愚蠢的問題:
我現在所擁有的:
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...
使用 awk,您可以將輸出記錄分隔符ORS
設置為空格:
awk -v ORS=' ' '1' file
默認情況下,輸入記錄分隔符是換行符。 當您使用print
時,這被 awk 刪除並替換為ORS
(默認情況下為換行符)。 腳本1
是最短的true條件,它會觸發默認操作{ print }
。
它比將echo
與cat
一起使用略長,但這種方法有許多優點。
首先,文件中的空白被保留。 這是因為當您將cat
的結果傳遞給echo
,它只會將文件中的單詞視為參數列表,並以單個空格分隔打印。
其次,文件中的特殊字符沒有問題,例如*
,在傳遞給echo
之前,shell 會對其進行全局擴展。
第三,這一切都發生在一個進程中,而不是使用子shell。
假設名為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
鑒於此問題的通用標題,以下是以下解決方案的概括方法:
paste
和tr
解決方案僅適用於單字符分隔符。awk
解決方案可以處理任何字符序列(字符串) 。 這個答案指向了最簡單的解決方案,它也避免了尾隨空格: 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 '{ printf "%s%s", sep, $0; sep = " " }' file
)
awk
未初始化的變量在字符串上下文中默認為空字符串,因此sep
最初為空。
sep $0
實際上與輸入行$0
相同。NR==1 { sep = " " }
將變量sep
設置為單個空格,如果當前行號 ( NR
) 為 1。因此,從第 2 行開始, sep
將是單個空格,因此在前面添加單個空格到輸出上的每個后續輸入行。 最終效果是只在輸入行之間插入空格,而不是在末尾插入空格。
如果您不想要尾隨換行符,請省略END { printf "\\n" }
。
使用tr
一個簡單替代方法,假設尾隨空格不是問題:
tr '\n' ' ' < file
請注意,沒有輸出尾隨換行符。
如果確實需要刪除尾隨空格,
使用GNU head
:
tr '\\n' ' ' < file | head -c -1
否則,使用 shell 參數擴展:
str=$(tr '\\n' ' ' < file) str=${str% } printf %s "$str" # use '%s\\n' to output a trailing newline
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.