我在通过脚本将csv文件中的列中的变量多于4时遇到问题
cat $1 |
grep "SomeText" |
sed -e "s/^.*var1: \([0-9]*\)\/\([0-9]*\), var2: \([0-9]*\)\/\([0-9]*\), var3: \([0-9]*\)\/\([0-9]*\), var4: \([0-9]*\)\/\([0-9]*\), var5: \([0-9]*\)\/\([0-9]*\), var6: \([0-9]*\)\/\([0-9]*\).*/\1 \2 \3 \4 \5 \6 \7 \8 \9 \10 \11 \12/g" |
awk "{ printf(\"%d;%d;%d;%d;%d;%d\\n\",
\$1*4294967296+\$2,
\$3*4294967296+\$4,
\$5*4294967296+\$6,
\$7*4294967296+\$8,
\$9*4294967296+\$10,
\$11*4294967296+\$12); }" > $1.csv
从类似的日志中
...
...
19/10/17 11:10:54 SomeText: var1: 0/1538614, var2: 0/1544404, var3: 0/99989, var4: 0/1312988, var5: 0/1312988, var6: 0/1212940
19/10/17 11:10:55 SomeText: var1: 0/2338726, var2: 0/2344516, var3: 0/899999, var4: 0/2113073, var5: 0/2113073, var6: 0/2012977
...
...
前四个变量很好,所有var1值都存储到第一列,var2值存储到第二列,依此类推。问题从第五个var开始。我不知道该如何解决,但我认为问题出在脚本的这一部分
.*/\1 \2 \3 \4 \5 \6 \7 \8 \9 \10 \11 \12
需要在具有两位数字(10+)的数字上使用转义字符或类似的字符吗?
感谢任何帮助或建议,谢谢。
sed中的有效后备引用是\1
,\2
,...,\9
。您尝试使用\10 \11 \12
无效,例如\10
被解释为\1
,后跟文字0
。
您需要使用功能更强大的工具来代替您的工具,例如Perl:
perl -ne '(@groups = m/: ([0-9]*)\/([0-9]*)/g) && print(join(" ", @groups), "\n")'
给出您的输入示例,这将产生如下所示的行:
0 1538614 0 1544404 0 99989 0 1312988 0 1312988 0 1212940 0 2338726 0 2344516 0 899999 0 2113073 0 2113073 0 2012977
[此外,在同一管道中使用grep
,sed
,awk
是可疑的,因为所有这些工具都具有过滤和流编辑功能,并且其中功能最强大的功能通常可以以较低的开销(运行的进程更少)来执行功能较弱的功能。
一些例子:
grep foo | sed -e 's/.../.../'
应替换为sed -e '/foo/s/.../.../'
grep foo | awk '{ ... }'
应替换为awk '/foo/ { ... }'
[cat filename | grep pattern
应替换为grep pattern filename
。