2016-01-23 51 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 

这可能是一种更高效的就地解决方案,但它可以完成这项工作。