Text-Processing
如何轉置多個txt文件?
我有 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
文件名的長度相同。