我在指定的路径中有一堆文件,我想在其中以有效的方式删除最后一行中第二次出现,
的所有,
。
我不希望流程读取每一行,而只是直接转到最后一行并删除,
第二次出现的,
。
另外,如果最后一行有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 :(得分: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