我有一个包含65000行(大小约为28 MB)的csv文件。在每一行中,给出了开头的某个路径,例如, " C:\ ABC \ BCD \ DEF \ 123 \ 456&#34 ;.现在让我们说道路" c:\ abc \ bcd \"在所有行中都很常见,其余内容也不同。我必须使用shell脚本从所有行中删除公共部分(在本例中为#34; c:\ abc \ bcd \")。例如,CSV文件的内容如上所述。
C:/Abc/Def/Test/temp\.\test\GLNext\FILE0.frag 0 0 0
C:/Abc/Def/Test/temp\.\test\GLNext\FILE0.vert 0 0 0
C:/Abc/Def/Test/temp\.\test\GLNext\FILE0.link-link-0.frag 16 24 3
C:/Abc/Def/Test/temp\.\test\GLNext\FILE0.link-link-0.vert 87 116 69
C:/Abc/Def/Test/temp\.\test\GLNext\FILE0.link-link-0.vert.bin 75 95 61
C:/Abc/Def/Test/temp\.\test\GLNext\FILE0.link-link-0 0 0
C:/Abc/Def/Test/temp\.\test\GLNext\FILE0.link-link-6 0 0 0
在上面的示例中,我需要输出如下
FILE0.frag 0 0 0
FILE0.vert 0 0 0
FILE0.link-link-0.frag 17 25 2
FILE0.link-link-0.vert 85 111 68
FILE0.link-link-0.vert.bin 77 97 60
FILE0.link-link-0 0 0
FILE0.link 0 0 0
你们有没有人可以帮我解决这个问题?
答案 0 :(得分:1)
您可以使用sed
:
$ cat test.csv
"c:\abc\bcd\def\123\456", 1, 2
"c:\abc\bcd\def\234\456", 1, 2
"c:\abc\bcd\def\432\456", 3, 4
$ sed -i.bak -e 's/c\:\\abc\\bcd\\//1' test.csv
$ cat test.csv
"def\123\456", 1, 2
"def\234\456", 1, 2
"def\432\456", 3, 4
我在这里使用sed
:
sed -e 's/<SEARCH TERM>/<REPLACE_TERM>/<OCCURANCE>' FILE
,其中
<SEARCH TERM>
(在这种情况下为c:\abc\bcd\
,但需要转义反斜杠。)<REPLACE TERM>
是我们想要替换它的,在这种情况下没有,和<OCCURANCE>
是我们要替换的项目的出现,在这种情况下是每行中的第一项。(-i.bak
代表:不要输出,只需编辑此文件。(但先备份))
根据@ david-c-rankin评论更新。他是对的,在编辑文件之前做好备份,以免出错。
答案 1 :(得分:0)
# init variable
MaxPath="$( sed -n 's/,.*//p;1q' YourFile )"
GrepPath="^$( printf "%s" "${MaxPath}" | sed 's#\\#\\\\#g' )"
# search the biggest pattern to remove
while [ ${#MaxPath} -gt 0 ] && [ $( grep -c -v -E "${GrepPath}" YourFile ) -gt 0 ]
do
MaxPath="${MaxPath%%?}"
GrepPath="^$( printf "%s" "${MaxPath}" | sed 's#\\#\\\\#g' )"
done
# Adapt your file
if [ ${#MaxPath} -gt 0 ]
then
sed "s#${GrepPath}##" YourFile
fi
grep -c -v -E
在性能方面没有得到优化(每次在第一次错过时停止处理whle文件)