2014-01-26 23 views
0

我遇到了一些代码问题,我不熟悉Linux Bash编程,因此我试图找不到能够适合我的任务的东西整天都希望你能帮助我指引正确的方向。根据字段拆分文件并保存在使用根名称创建的子目录中

我有很多大文件,我想根据每个文件中的第三个字段进行分割,我想在每个子文件中保留头文件,并将创建的子文件保存到新目录中从文件的根名称创建。

存储在原始目录中的初始文件是:

Downloads/directory1/Levels_CHG_Lab_S_sample1.txt 
Downloads/directory1/Levels_CHG_Lab_S_sample2.txt 
Downloads/directory1/Levels_CHG_Lab_S_sample3.txt 

等..

每个文件有200列,且将列3包含通过10. 我从1个值想要根据此列的值拆分上面的每个文件,并将子文件存储在子文件夹中,例如子文件夹“Downloads/directory1/sample1”将包含10个文件(包含标题行)文件Downloads/directory1/Levels_CHG_Lab_S_sample1.txt。

我已经尝试了现在许多不同的步骤,这些步骤,没有成功..我必须使这更复杂,因为我试过的代码看起来很干净... 这是我正在努力的代码:

FILES=Downloads/directory1/ 

for f in $FILES 
    do 
    # Create folder with root name by stripping file names 
    fname=${echo $f | sed 's/.txt//;s/Levels_CHG_Lab_S_//'} 
    echo "Creating sub-directory [$fname]" 
    mkdir "$fname" 

    # Save the header 
    awk 'NR==1{print $0}' $f > header 

    # Split each file by third column 
    echo "Splitting file $f" 
    awk 'NR>1 {print $0 > $3".txt" }' $f 

    # Move newly created files in sub directory 
    mv {1..10}.txt $fname # I have no idea how to do specify the files just created 

    # Loop through the sub-files to attach header row: 
    for subfile in $fname 
     do 
     cat header $subfile >> tmp_file 
     mv -f tmp_file $subfile 
     done 
done 

所有这些步骤看起来很复杂,对我来说,我非常感谢,如果你能帮助我以正确的方式解决这个问题。非常感谢您的帮助。 -fra

回答

1

您的代码现在有几个问题。首先,你没有点列表你下载目录的内容。您只需将FILES变量设置为该目录路径的字符串即可。你会需要这样的东西:

FILES=$(ls Downloads/directory1/*.txt) 

你也从来没有cdDownloads/directory1文件夹,所以你mkdir将在cwd创建目录;可能不是你想要的。

如果您知道第3列中的数字总是介于1到10之间,那么在分割文件之前,我只是预先使用标题行填充这些文件。

试试这个代码,做你想做的(未经测试)是什么:

BASEDIR=Downloads/directory1/ 
FILES=$(ls ${BASEDIR}/*.txt) 

for f in $FILES; do 
    # Create folder with root name by stripping file names 
    dirname=$(echo $f | sed 's/.txt//;s/Levels_CHG_Lab_S_//') 
    dirname="${BASENAME}/${dirname}/" 
    echo "Creating sub-directory [$dirname]" 
    mkdir "$dirname" 

    # Save the header to each file 
    HEADER_LINE=$(head -n1 $f) 
    for i in {1..10}; do 
     echo ${HEADER_LINE} > ${dirname}/${i}.txt 
    done 

    # Split each file by third column 
    echo "Splitting file $f" 
    awk -v dirname=${dirname} 'NR>1 {filename=dirname$3".txt"; print $0 >> filename }' $f 
done 
+0

嗨ebarrere,非常感谢你的帮助!它看起来像你明白我的问题,但是当你尝试你的步骤时,仍然有一些奇怪的事情发生:最后,你的代码给了我10个子文件,前缀为“sample1”,还有一个子文件夹,但它看起来像最后一个awk命令没有做到希望的东西,即将子文件重定向到子文件夹,所以它也不会附加到带有头文件的文件中......我尝试过使用此行的变体filename = dirname $ 3“ .txt“,但它似乎并没有工作..如果你可以发现为什么请让我知道 – user971102

+0

在awk行,如果我使用filename = dirname $ 3”。txt“已分割的文件不会进入子目录,而如果我尝试使用像这样的$ {dirname}/$ 3的斜线,则会出现”期望换行符或字符串末尾“错误 – user971102

+0

看起来像您需要在第7行中添加尾部的'/'到设置的'dirname'变量,如下所示:'dirname =“$ {BASENAME}/$ {dirname} /”'。试试看。 – ebarrere

相关问题