Text-Processing

如何轉置多個txt文件?

  • July 31, 2019

我有 1775 個 .txt 文件,每個 .txt 文件有 3023 行,它們看起來像這樣:

RIBBY_g_5ZCV995_BI_SNP_D04_38774.CEL
FQC-10090295         0.007813
FQC-10119363         0.023438
FQC-10132112         0.093750
...
UNTIL_g_3ECO791_BI_SNP_H10_36454.CEL
FQC-10090295 0.187500
FQC-10119363 0.023438
FQC-10132112 0.039063
...

如何製作一個矩陣來表示轉置的那些 txt 文件,使它們看起來像這樣:

                                    FQC-10090295 FQC-10119363 FQC-10132112  ...
RIBBY_g_5ZCV995_BI_SNP_D04_38774.CEL 0.007813     0.023438     0.093750  ...
UNTIL_g_3ECO791_BI_SNP_H10_36454.CEL 0.187500     0.023438     0.039063  ...

您的問題包含許多未指定的參數,但作為起點,請考慮以下bash腳本:

header=

for f in *.CEL
do
   if [ -z "$header" ]
   then
       l=${#f}                 # length of filename ...
       fmt="%-${l}s"           # ... determines width of first column

       header="$(printf "$fmt" "")"    # first column of first row is blank

       for col in $(awk '{print $1}' $f)
       do
           l=${#col}               # width of column
           [ $l -lt 8 ] && l=8     # min width of 8
           header="$header $(printf "%-${l}s" "$col")"     # append column label to header
           fmt="$fmt %-$l.6f"
       done
       printf '%s\n' "$header"         # header is first row of output
   fi

   printf "$fmt\n" "$f" $(awk '{print $2}' $f)     # print filename and all column 2 values
done

執行腳本給出:

                                    FQC-10090295 FQC-10119363 FQC-10132112
RIBBY_g_5ZCV995_BI_SNP_D04_38774.CEL 0.007813     0.023438     0.093750    

我將您的輸入文件複製到第二個文件名,然後重新執行:

                                    FQC-10090295 FQC-10119363 FQC-10132112
RIBBY_g_5ZCV995_BI_SNP_D04_38774.CEL 0.007813     0.023438     0.093750    
RIBBY_g_5ZCV995_BI_SNP_D04_38775.CEL 0.007813     0.023438     0.093750    

該腳本首先工作,循環遍歷所有*.CEL文件。

header對於第一個文件,腳本基於所有文件名長度相同的假設建構標題行。在建構標題行的同時,腳本還建構了一個printf格式字元串fmt,用於顯示列數據。格式字元串中的第一個欄位是長度足以顯示文件名的字元串。

接下來的腳本循環遍歷第一個輸入文件中的所有“列 1”值,這些值是值標籤。對於每一列,腳本再次獲取值標籤的長度(但不小於 8),並將該標籤添加到標題中。fmt它還向字元串添加了浮點格式規範。

在腳本遍歷所有列標籤後,它會輸出已建構的標題字元串。

上述所有步驟僅針對第一個文件。

處理第一個文件的最後一步,也是處理第一個文件之後的所有文件的唯一步驟,是使用在第一次循環迭代期間創建printf的字元串顯示文件名和“列 2”值。fmt然後腳本繼續處理下一個*.CEL文件(如果有)。

這種方法假定所有文件中的列標籤都相同,並且所有*.CEL文件名的長度相同。

引用自:https://unix.stackexchange.com/questions/531926