如何使用shell脚本删除CSV文件中多行中常见的特定字符串?

时间:2015-04-15 08:14:07

标签: linux shell csv awk sed

我有一个包含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

你们有没有人可以帮我解决这个问题?

2 个答案:

答案 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
  • 假设样本中没有特殊的正则表达式字符,也没有#MaxPath
  • grep -c -v -E在性能方面没有得到优化(每次在第一次错过时停止处理whle文件)