Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 将目录文件中的特定列提取到新文件中_Python_Shell_Awk - Fatal编程技术网

Python 将目录文件中的特定列提取到新文件中

Python 将目录文件中的特定列提取到新文件中,python,shell,awk,Python,Shell,Awk,我有一个11064个文件的集合,它们都有相同的文件扩展名ReadsPerGene.out.tab。它们在一个目录中。所有文件都有556行4列 Filenames look like this: SRR123.ReadsPerGene.out.tab SRR456.ReadsPerGene.out.tab SRR555.ReadsPerGene.out.tab DRR789.ReadsPerGene.out.tab ... File looks like this: for SRR123Read

我有一个11064个文件的集合,它们都有相同的文件扩展名ReadsPerGene.out.tab。它们在一个目录中。所有文件都有556行4列

Filenames look like this:
SRR123.ReadsPerGene.out.tab
SRR456.ReadsPerGene.out.tab
SRR555.ReadsPerGene.out.tab
DRR789.ReadsPerGene.out.tab
...

File looks like this:
for SRR123ReadsPerGene.out.tab        for SRR789.ReadsPerGene.out.tab
A    45   67   78                       A    89O  90   34
B    17   40   23                       B    129  96   45
C    27   50   19                       C     60  56   91
...  ...  ...  ...                     ...   ...  ...  ...                                           
首先,我想判断所有文件的第一列是否相同

如果是真的,我想创建一个包含665行11065列的output.txt文件。第1列是每个文件的第一列(因为它们是相同的)。output.txt的11065列中的第2列是每个输入文件的第2列,我想在每列的第一行添加特定的文件名

The output.txt looks like this:

      SRR123                SRR789              SRR456        ...
A        45                 89O                66            ...
B        17                 129                480           ...
C        27                  60                78            ...
...      ...               ...               ...             ...
以下是我的答案**
**1. 获取所有文件名

#!/bin/bash
cd ~
filepath=/home/shared/maize/bam_rsem
cd ${filepath}
for file in $(ls *.ReadsPerGene.out.tab)
do
   echo $file >> ~/filename.txt
done
二,获取一个文件中的所有第一列

#!/bin/bash
cd ~
OUT=result2.txt
touch $OUT
filepath=/home/shared/maize/bam_rsem/
for file in $(cat filename.txt)
do
   filePATH=`echo ${filepath}$file`
   cut -f 1 $filePATH | sed 1i\ ${file} >$OUT.tmp1
   paste $OUT $OUT.tmp1 >$OUT.tmp
   rm $OUT.tmp1
   mv $OUT.tmp $OUT
done
三,比较第一列是否与result2.txt中的其他列相同 我现在不知道。
4. 创建输出.txt

#!/bin/bash
cd ~
OUT=result2.txt
touch $OUT
filepath=/home/shared/maize/bam_rsem/
for file in $(cat filename.txt)
do
   filePATH=`echo ${filepath}$file`
   cut -f 1 $filePATH | sed 1i\ ${file} >$OUT.tmp1
   paste $OUT $OUT.tmp1 >$OUT.tmp
   rm $OUT.tmp1
   mv $OUT.tmp $OUT
done

cut -f 1 result2.txt >$OUT.tmp2
paste $OUT.tmp2 $OUT >$OUT.tmp3
rm $OUT.tmp2
mv $OUT.tmp3 $OUT
我应该为我的脚本做什么?在Linux中执行我的脚本真的很慢。 或者我应该编写一个Python脚本来处理它,但我从来没有学习过Python或Perl,我只对Linux了解一点


很抱歉,我的英语很差,我不能及时回复。无论如何,谢谢你的回答

试试这个,并在回答的评论部分告诉我它是否有效

将熊猫作为pd导入
导入glob
文件=已排序(glob.glob(“*.log.out”,recursive=False))
#已删除列1=列表()
#保留列2=列表()
drop_files=dict()
keep_files=dict()
ref_file_name='SRR123.log.out'
df_ref_file=pd.read_csv(ref_file_name,sep='\t',header=None)
对于i,枚举中的文件名(文件):
df_file=pd.read_csv(文件名,sep='\t',header=None)
如果df_ref_文件['0']!=df_文件['0']:
drop_files.update({filename:df_file['0'].tolist()})
#已删除\u col_1.append(df_文件['0'].tolist())
其他:
keep_files.update({filename:df_file['1'].tolist()})
#keepted_col_2.append(df_文件['1'].tolist())
df=pd.DataFrame(keep_files,index=df_ref_file['0'])
df.index.names=['ID']
df.reset_索引(原地=真)
#检查数据框的形状
形状

awk中的一个。要处理的文件名位于
文件中(由于文件数量较多):

awk程序将在包含数据文件的目录中运行(
split
ing头文件名的第一个
分隔部分,即前导路径将使头文件名相当长):

[++nr]在所有AWK中的顺序都不一样
:显然有些AWK更喜欢
d[++nr]=d[nr]of s$2
,而有些
d[nr]=d[++nr]of s$2
,所以分开的
nr++
对两者都有效

更新

如果文件位于不同路径,并且文件
文件
中的文件名不包含路径,请智能替换:

split(files[i],t,".")
...
while((getline < files[i])>0) {


一个稍微好一点的版本。可能有人(不是我)投了反对票,因为你没有包括你解决问题的最佳尝试。请更新您的Q,以包括您为您的问题编写解决方案的最佳尝试(这很有趣)。看看
xargs
gnu parallel
,它们可能有助于处理如此多的文件。。。。我还会预扫描您的文件,并将所有正确文件的文件名保存到文本文件中,然后使用该文件“驱动”您的进程。祝你好运。你可能想解释一下数据的最终用途,因为很难想象有11064列的电子表格是可用的(或可加载的)。这些数据可能更好地存储在数据库中,并具有一组经过适当设计的表和键。再次祝你好运
awk
支持使用字符序列作为索引的多维数组。GNU
awk
更进一步,支持
arr[i][j]
索引。请注意,您的存储要求并非不合理,一列的数据集(假设每个值4个字节)大约为
24M
。您需要为第一个文件的第一列使用一个数组,以便与剩余的文件进行比较,以确保它们相等。您可以为每个文件构建第二列数组,并在
END
规则中输出。您的选项实际上是
awk
、python或编译语言。shell脚本的速度会非常慢。在python或C/C++之类的编译语言中,只需将所有值读取/解析到一个分配的数组/向量结构中,该数组/向量结构包含文件名和一个表示第二列值的整数数组,就可以处理存储。在第2列数据的初始读取和存储过程中,您将对照第1列进行检查。然后,只需将信息以您需要的格式写出来,谢谢。我的机器出毛病了。我现在不能用熊猫。如果我能用的话,我会告诉你结果的。谢谢。但“文件[NR]=0美元”是什么意思?我很困惑。您能再解释一下吗?GNU awk documents
NR
:自程序开始执行以来,awk处理的输入记录数。它用作散列
文件
的键,存储文件
文件
中的文件名<代码>文件[1]=“SRR123.ReadsPerGene.out.tab”
等,谢谢!它确实适用于我的运动数据。但是我的filename.txt在/home.wzzuo中,我的数据在/home/shared/comery/bamrsem中。问题是我不能将它们移动到同一个目录中。所以我想修改你的代码,但它不起作用。我将“while((getline0”更改为“while((getline<“/home/shared/comery/bam_rsem/files[I]”>0)”。你能告诉我怎么了吗?没问题。别忘了:
$ awk '
BEGIN{OFS="\t"}
{
    files[NR]=$0                                # hash filenames from file files
}
END{
    for(i=1;i<=NR;i++) {                        # loop files
        nr=0
        split(files[i],t,".")
        h[nr]=h[nr] OFS t[1]                    # build header
        while((getline < files[i])>0) {         # using getline to read data records
            nr++                                # d[++nr] order not same in all awks
            d[nr]=d[nr] OFS $2                  # append data fields to previous
            if(i==1) {                          # get headers from first file
                h[(refnr=nr)]=$1
            } else if($1!=h[nr]) {              # check that they stay the same
                print "Nonmatching field name"
                exit                            # or exit without output
            }
        }
        if(nr!=refnr) {                         # also record count must be the same
            print "Nonmatching record count"
            exit
        }
        close(files[i])
    }
    for(i=0;i<=refnr;i++)                       # output part
        print h[i] d[i]
}' files
        SRR123  SRR789
A       45      89O
B       17      129
C       27      60
...     ...     ...
split(files[i],t,".")
...
while((getline < files[i])>0) {
file="home/shared/maize/bam_rsem/" files[i]
split(file,t,".")
...
while((getline < file)>0) {
close(files[i])
close(file)