我正在尝试对具有不同基因组区域的文件进行排序,并且每个区域本身都有一个字母和数字组合。
我想根据每个基因组位置 (columns1,2,3)
对整个文件进行排序,如果这 3 个相同,
并将其提取到一个新的单独文件中。
我的输入是:
1.txt
chr1 10 20 . . 00000 ACTGBACA
chr1 10 20 . + 11111 AACCCCHQ
chr1 18 40 . . 0 AA12KCCHQ
chr7 22 23 . . 21 KLJMWQKD
chr7 22 23 . . 8 XJKFIRHFBF24
chrX 199 201 . . KK AVJI24
我期待的是:
chr1.10-20.txt
chr1 10 20 ACTGBACA
chr1 10 20 AACCCCHQ
chr1.18-40.txt
chr1 18 40 AA12KCCHQ
chr7.22-23.txt
chr7 22 23 KLJMWQKD
chr7 22 23 XJKFIRHFBF24
chrX.199-201.txt
chrX 199 201 AVJI24
我正在尝试使用 awk
拆分文档,但这不是我想要做的。
awk -F, '{print > $1$2$3".txt"}' 1.txt
它为我提供了所有行的文件名,在文件内部,它又是整行,即使我只需要第 1、2、3 和 7 列。
>ls
1.txt
chr1 10 20 . + 11111 AACCCCHQ.txt
chr7 22 23 . . 21 KLJMWQKD.txt
chrX 199 201 . . KK AVJI24.txt
chr1 10 20 . . 00000 ACTGBACA.txt
chr1 18 40 . . 0 AA12KCCHQ.txt
chr7 22 23 . . 8 XJKFIRHFBF24.txt
>cat chr1\ \ \ \ 10\ \ 20\ .\ +\ 11111\ AACCCCHQ.txt
chr1 10 20 . + 11111 AACCCCHQ
如果您能告诉我如何修复文件名及其内容,我将不胜感激。
最佳答案
看看这个:
#!/bin/sh
INPUT="$1"
while read -r LINE; do
GEN_LOC="$(echo "$LINE" | tr -s ' ' '.' | cut -d '.' -f 1,2,3)"
echo "$LINE" | tr -s ' ' | cut -d ' ' -f 1,2,3,6,7 >> "${GEN_LOC}.txt"
done < "$INPUT"
此脚本将采用您发布的格式获取输入文件并逐行读取。对于每一行,它会将额外的空格替换为文件名的点,并将其缩减为字段 1、2 和 3(将其存储在 $GEN_LOC
变量中)。然后,它将整个 $LINE
附加到名为 ${GEN_LOC}.txt
的文件中。如果有多行最终输出到相同的文件名,那很好——该行将只是附加。这不考虑以前的运行,因此如果您运行两次,它将不断附加到现有文件。希望这对您有所帮助!
关于linux - 排序文件并将它们放在不同的文件中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47521568/