2013-03-01 77 views
3

我有一個文本文件,可以有X個字段,每個字段用逗號分隔。在我的腳本中,我逐行閱讀,檢查該行上已填充了多少個字段,並確定需要將多少個逗號附加到該行的末尾來表示所有字段。例如,一個文件是這樣的:bash:逐行讀取文件並sed追加

Address,nbItems,item1,item2,item3,item4,item5,item6,item7  
2325988023,7,1,2,3,4,5,6,7 
2327036284,5,1,2,3,4,5 
2326168436,4,1,2,3,4 

應該成爲這樣的:

Address,nbItems,item1,item2,item3,item4,item5,item6,item7 
2325988023,7,1,2,3,4,5,6,7 
2327036284,5,1,2,3,4,5,, 
2326168436,4,1,2,3,4,,, 

我下面的作品腳本,但似乎非常低效的。逐行閱讀是否對大文件有困難?這是導致經濟放緩的sed嗎?更好的方式來做到這一點?

#!/bin/bash 

lineNum=0 
numFields=`head -1 File.txt | egrep -o "," | wc -l` 

cat File.txt | while read LINE 
do 
     lineNum=`expr 1 + $lineNum` 
     num=`echo $LINE | egrep -o "," | wc -l` 
     needed=$((numFields - num)) 
     for ((i=0 ; i < $needed ; i++)) 
     do 
       sed -i "${lineNum}s/$/,/" File.txt 
     done 
done 

回答

11

這種類型的事情是一個像awk語言通常是最好的做法,例如:

awk 'NR==1{n=NF}{$n=$n}1' FS=, OFS=, file 
+1

+1 Nice! ..... – Kent 2013-03-01 16:12:19

+0

哇,非常感謝。它不僅完美達到我的目標,而且簡單而快速! – ssbsts 2013-03-01 23:42:26

+0

+1一如既往的Scrutinizer優雅的解決方案, - Akshay – 2014-02-20 18:02:43

0

這裏是一個完整的解決方案bash

(
    IFS="," 
    read hdrLine 
    echo "$hdrLine" 
    read -a header <<< "$hdrLine" 
    numFields="${#header[@]}" 

    while read -a line; do 
     pad=${#line[@]} 
     while ((pad < numFields)); do 
      line[pad++]= 
     done 
     echo "${line[*]}" 
    done 
) <File.txt> newFile.txt 
mv newFile.txt File.txt 

awk解決方案是好得多;這最好看作bash演示。

+0

感謝您的輸入,但它實際上並沒有達到我的目標。從我所知道的情況來看,即使沒有必要,也只會在每一行附加一個逗號,即所有字段已經佔了。 – ssbsts 2013-03-01 23:44:00

+0

這就是我沒有先測試的結果。如果你分配給一個更大的索引,我最近讀不出宣佈該數組將填充中間插槽。我想知道我在想什麼,因爲它肯定不會是'bash'!我會留下這個答案一下,看看我是否可以挽救它;否則我會刪除。 – chepner 2013-03-01 23:52:58