2014-01-26 70 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

相關問題