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 ...
답변1
귀하의 질문에는 지정되지 않은 많은 매개변수가 포함되어 있지만 시작점으로 다음 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
파일 이름의 길이가 동일하다고 가정합니다.
답변2
다음과 같은 것이 필요합니다.
$ cat tst.awk
BEGIN { OFS="\t" }
FNR==1 {
row = $1
rows[row]
next
}
{
col = $1
cols[col]
vals[row,col] = $2
}
END {
printf "%s", ""
for (col in cols) {
printf "%s%s", OFS, col
}
print ""
for (row in rows) {
printf "%s", row
for (col in cols) {
printf "%s%s", OFS, vals[row,col]
}
print ""
}
}
하지만 귀하의 요구 사항을 명확히 하는 입력/출력이 없으므로 테스트할 수 있습니다(참조내 댓글), 이는 검증되지 않은 추측일 뿐입니다.