Regex vim&;csv文件:将标题信息放入新列
我有大量csv文件,如下所示:Regex vim&;csv文件:将标题信息放入新列,regex,vim,csv,replace,copy-paste,Regex,Vim,Csv,Replace,Copy Paste,我有大量csv文件,如下所示: xxxxxxxx xxxxx 装运,YD564n xxxxxxxxx xxxxx 1,RR1760 2,HI3503 3,HI4084 1824年11月4日 我需要使它们看起来如下所示: xxxxxxxx xxxxx 装运,YD564n xxxxxxxxx xxxxx YD564n,1,RR1760 YD564n,2,HI3503 YD564n,3,HI4084 YD564n,4,HI1824 YD564n是一个装运编号,每个csv文件的装运编号都不同。但
xxxxxxxx
xxxxx
装运,YD564n
xxxxxxxxx
xxxxx 1,RR1760
2,HI3503
3,HI4084
1824年11月4日
我需要使它们看起来如下所示:
xxxxxxxx
xxxxx
装运,YD564n
xxxxxxxxx
xxxxx YD564n,1,RR1760
YD564n,2,HI3503
YD564n,3,HI4084
YD564n,4,HI1824
YD564n是一个装运编号,每个csv文件的装运编号都不同。但它总是在“发货”之后出现
我可以使用什么vim命令?在一个文件中,在正常模式下键入以下命令:
qqgg/^Shipment,<CR>ww"ay$}j:.,$s/^/<C-R>a,<CR>q
qqgg/^shipping,ww“ay$}j:,$s/^/a,q
请注意,
是回车键,
是CTRL-R
这将更新该文件并在寄存器q中重新创建命令
然后在另一个文件中键入@q(也在正常模式下)。(这将回放寄存器q)这可以作为Perl一行程序来完成:
perl -i.bak -e' $c = do {local $/; <>};
($n) = ($c =~ /Shipment,(\w+)/);
$c =~ s/^(\d+,)/$n,$1/gm;
print $c' shipment.csv
好吧,不要抨击我,但是…你可以考虑:不要在vim中这样做 这是脚本语言的经典用法示例。 以基本的python、perl或ruby教程为例 在里面 这方面的正则表达式可能不太难,在vim中是可行的。 但还有更容易的选择。
还有更灵活的方法。您可以使用宏并将其应用于多个文件 以下是一个示例。按原样键入以下内容:
3gg$"ayiw:6,$s/^/<C-R>a/<CR>:w<CR>:bn<CR>
然后,如果您有200个csv文件,您可以按如下方式打开vim
vim *.csv
然后
200<C-A>
200
在那里键入Ctrl-A,应该全部完成
这就是说,使用合适的脚本语言,我肯定会更轻松,它会更简单。为什么使用vim
尝试以下shell脚本:
#!/bin/sh
input=$1
shipment=`grep Shipment $input|awk -F, '{print $2}'`
mv $input $input.orig
sed -e "s/^\([0-9]\)/$shipment,\1/" $input.orig > $input
您可以遍历特定文件:
for input in *.txt
do
script.sh $i
done
我还认为这不太适合vim,不如换成Bash
FILENAME='filename.csv' && SHIPMENT=`grep Shipment $FILENAME | sed 's/^Shipment,//'` && cat $FILENAME | sed "s/^[0-9]/$SHIPMENT,&/" > $FILENAME
for input in *.txt
do
script.sh $i
done
FILENAME='filename.csv' && SHIPMENT=`grep Shipment $FILENAME | sed 's/^Shipment,//'` && cat $FILENAME | sed "s/^[0-9]/$SHIPMENT,&/" > $FILENAME