簡體   English   中英

如何在bash中將列表轉換為字符串?

[英]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 }

它比將echocat一起使用略長,但這種方法有許多優點。

首先,文件中的空白被保留。 這是因為當您將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

鑒於此問題的通用標題,以下是以下解決方案的概括方法

  • pastetr解決方案僅適用於單字符分隔符。
  • 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM