나는 22000개의 유전자를 포함하는 상관 행렬을 가지고 있으며 일부 분석을 수행하려면 행렬의 각 행을 새 파일로 분할해야 합니다. 이는 22,000개의 별도 파일을 생성해야 함을 의미합니다.
입력 파일 예에 대해 (gene_name.txt라는 출력 파일을 가져오고 싶기 때문에) 분할 명령을 사용하고 싶지 않습니다.
IGHD2-15 IGHD3-22 IGHD3-16 IGHD3-10
IGHD2-15 1 0.696084 0.799736 0.818788
IGHD3-22 0.696084 1 0.691419 0.67505
IGHD3-16 0.799736 0.691419 1 0.810656
IGHD3-10 0.818788 0.67505 0.810656 1
답변1
유전자 이름이 첫 번째 열에 있다고 가정하면 원하는 것은 다음과 같습니다.
awk '{print >> $1".txt"; close(n".txt")}' matrix.txt
이렇게 하면 이름이 줄의 첫 번째 필드에 확장자(완전히 선택 사항)가 붙은 파일에 각 줄이 인쇄됩니다 .txt
. 파일에 유전자 이름을 포함하지 않으려면 다음을 사용하십시오.
awk '{n=$1; $1="";print >> n".txt"; close(n".txt")}' matrix.txt
첫 번째 줄이 헤더인 경우 다음을 사용하세요.
awk 'NR>1{print >> $1".txt"; close($1".txt")}' matrix.txt
마지막으로, 첫 번째 필드가 단순한 유전자 이름이 아니지만 NULL 또는 유효한 경로를 포함할 수 있으므로 파일에 줄이 포함될 수 있으므로 입력을 삭제해야 하는 경우에는 다음을 사용할 수 있습니다.
awk 'NR > 1 && ($1 ~ /^[A-Z0-9-]+$/) { print >> $1; close($1) }'
답변2
각 파일에 포함할 내용에 대한 예를 제공하지 않았거나 파일 이름을 무엇으로 지정해야 할지 추측하고 있기 때문입니다.
이는 현재 디렉터리에서 "DATA" 파일을 가져오고 각 행의 첫 번째 열 이름을 따서 동일한 디렉터리에 새 파일을 만든 다음 해당 파일을 나머지 열의 데이터로 채웁니다.
중요성
IGHD2-15 1 0.696084 0.799736 0.818788
이라는 파일을 만들어서 IGHD2-15
넣어주세요.
1 0.696084 0.799736 0.818788
스크립트:
#!/bin/bash
while read -r line; do
newFileName="$(echo "$line" | awk '{print $1}')"
newFileData="$(echo "$line" | awk '{$1 = ""; print $0}')"
echo $newFileData > $newFileName
done < DATA
답변3
아래 방법을 시도해 보았는데, 확인해 보니 잘 작동합니다.
여기서 각 줄은 새 파일에 복사됩니다. 파일 이름은 각 줄의 첫 번째 열이 됩니다.
cat data_file.txt
IGHD2-15 1 0.696084 0.799736 0.818788
IGHD3-22 0.696084 1 0.691419 0.67505
IGHD3-16 0.799736 0.691419 1 0.810656
IGHD3-10 0.818788 0.67505 0.810656 1
root@praveen_linux_example dev]# j=`cat data_file.txt| wc -l`
[root@praveen_linux_example dev]# for ((z=1;z<=$j;z++)); do filename=`awk -v line="$z" 'NR==line{print $1}' data_file.txt`; sed -n ''$z'p' data_file.txt >$filename.txt;done
[root@praveen_linux_example dev]#