仅在最后一行中删除第二次出现逗号后的逗号并检查标志

时间:2016-01-23 08:25:18

标签: bash

我在指定的路径中有一堆文件,我想在其中以有效的方式删除最后一行中第二次出现,的所有,

我不希望流程读取每一行,而只是直接转到最后一行并删除,第二次出现的,

另外,如果最后一行有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

2 个答案:

答案 0 :(得分: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

可能有一个更有效的现场解决方案,但它可以完成这项工作。

答案 1 :(得分: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