2016-01-23 48 views
0

我有一堆文件在指定的路徑,其中我想刪除所有,後第二次發生,在最後一行,在一種有效的方式。刪除逗號發表第二次逗號發生只在最後一行,並檢查標誌

我不希望進程讀取每行,而是直接轉到最後一行,並刪除,後第二次出現的,

此外,我想要檢查,如果最後一行有EOF在其中;如果不可用,則不會應用更改,請移至下一個文件。

示例文件:

A,111,aaa,A  
B,222,bbb,B 
X,EOF,,,,x,X 

輸出:

A,111,aaa,A 
B,222,bbb,B 
X,EOF,xX 

例子:

for i in $(ls /mypath/*.csv); do 
sed '$s/,$//' < $i 
done 

回答

0

這應該做你正在尋找。

注:顯然sed的不提供「-i」所有 平臺選項。如果您的平臺是這種情況,您必須使用 臨時文件

請注意(感謝glenn jackman對此的評論):這可能是 僅適用於GNU sed實現。您可能需要適應於其他實現方式

for i in $(ls /mypath/*.csv); do 
    if [[ `tail -n 1 $i | sed -n /EOF/p` != '' ]]; then 
    sed -i '$s/\([,]\)//3g' $i 
    fi 
done 
+1

的單曲/// 3g'行爲是不確定的POSIX sed的,但GNU的sed的 解決方案指定它:https://www.gnu.org/軟件/ SED /手動/ sed.html#的-_0022s_0022命令 –

0

使用head一切複製除最後一行到一個臨時文件。獲取最後一行tail,使用sed處理它並將其附加到臨時文件。最後但並非最不重要的是,用原來的文件替換原來的文件。

for FILE in /mypath/*.csv ; 
do 
    TMP_FILE="${FILE}.processed" 
    head -n "-1" "$FILE" > "$TMP_FILE" 
    tail -n "1" "$FILE" | sed 's/,\+/,/g' >> "$TMP_FILE" 
    mv -f "$TMP_FILE" "$FILE" 
done 

這可能是一種更高效的就地解決方案,但它可以完成這項工作。