鉴于此文件(注释不是文件的一部分,而是构成解释的一部分)...
x,a,001,b,c,d,y
x,a,002,b,c,e,yy
x,bb,003,b,d,e,y
x,c,004,b,d,e,y
x,c,005,b,d,e,y # nb - dupe of row 4
x,dd,006,b,d,e,y
x,c,007,b,d,e,y # nb - dupe of row 4 and 5
x,dd,008,b,d,f,y
x,dd,009,b,d,e,y # nb - dupe of row 6
x,e,010,b,d,f,y
Run Code Online (Sandbox Code Playgroud)
...我想得出以下输出:
x,a,001,b,c,d,y
x,a,002,b,c,e,yy
x,bb,003,b,d,e,y
x,c,004,b,d,e,y
x,dd,006,b,d,e,y
x,dd,008,b,d,f,y
x,e,010,b,d,f,y
Run Code Online (Sandbox Code Playgroud)
如果从文件中删除第 3 列,然后在文件上运行 uniq,那么如果剩余的行在正确的位置重新添加了第 3 列的值,那么我将得到上述结果。
但我真的很挣扎,想出一些可以做到这一点的东西。我很高兴有机会了解 linux 的文本处理实用程序。
性能:文件看起来不太可能增长到超过 1MB,而且每天只有 1 个文件。
目标:Debian GNU/Linux 7 amd64,256MB/至强。
编辑:调整示例,因为字段不是固定宽度,uniq --skip-chars=n据我所知,涉及的解决方案将不起作用。
我有一个目录,其中包含来自不同供应商的大量具有两种不同编码的 csv 文件:
我想使用传统语法在这些数据文件上使用 grep、awk、sed 和其他实用程序。
将这些文件从 UTF-16 重新编码为 UTF-8 不会丢失任何有用的数据。所有 csv 文件只包含 ASCII 数据,所以我无法理解为什么某些供应商有时将它们作为小端 UTF-16 提供。
我写了一个简短的脚本来解析 的输出file,但我认为它可能非常脆弱。
必须有更好的方法来管理具有多种编码的文件,是否有任何程序或实用程序可以帮助解决此类问题?
我正在使用 Debian 稳定版。
for f in ./*.csv
do
if [[ $(file "$f") == *"UTF-16"* ]]
then
iconv -f UTF-16 -t UTF-8 "$f" > "$f"-new
mv "$f"-new "$f"
fi
done
Run Code Online (Sandbox Code Playgroud)