linux - 排序文件并将它们放在不同的文件中

标签 linux sorting text process

我正在尝试对具有不同基因组区域的文件进行排序,并且每个区域本身都有一个字母和数字组合。

我想根据每个基因组位置 (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/

相关文章:

java - 按列表值排序 List<List<String>>

java - 按车牌号比较汽车对象列表

c# - 算法:基于相同序列的数字替换

python - 如何使用 Python 识别二进制文件和文本文件?

java - 如何在JPanel中添加一个可编辑的文本框

c++ - 编写 C++ 程序以从 Linux 命令行搜索索引文件

c# - 为什么 FileSystemWatcher 在监视 Windows 卷的 Linux 容器中不起作用

linux - 如何从命令行检查 Spark 配置?

javascript - Three.js 正交相机文本

xml - 在没有 XML 解析器的情况下为最近修改的文件过滤 svn ls --xml