여러 txt 파일을 바꾸는 방법은 무엇입니까?

여러 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  ...

답변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 ""
    }
}

하지만 귀하의 요구 사항을 명확히 하는 입력/출력이 없으므로 테스트할 수 있습니다(참조내 댓글), 이는 검증되지 않은 추측일 뿐입니다.

관련 정보