我有一个大约 2500 万行的大型 csv 文件256列。 CSV 文件的字段分隔符是~
字符。
我想像这样替换前两列数据
From : data1~data2~data3..................................
To : "data1"~"data2"~data3................................
我目前正在使用awk
,但像这样:
cat file | awk -F "~" '{print "\""$1"\"""\""$2"\"~"$3"~"$4"~"...................}'
所以我在 awk 中输入 256 列,例如$4"~"$5"~"$6"~".....$256"~"
还有其他更好的编码方式吗?
答案1
不,您不需要指定所有 256 个字段,只需更改第一列和第二列即可执行以下操作,然后执行print
withOFS='~'
并避免cat
使用awk
whileawk
也可以单独从文件中读取。
awk -F'~' '{$1="\""$1"\""; $2="\""$2"\""; print}' OFS='~' infile
对最后两个字段进行更改。
awk -F'~' '{$(NF-1)="\""$(NF-1)"\""; $NF="\""$NF"\""; print}' OFS='~' infile
答案2
通常sed
会写
sed 's/[^~]*/"&"/;s//"&"/2'
但是因为你提到了一个大文件,所以这个可能是快多了比上面的解决方案或awk
版本:
sed 's/\(^[^~]*\)~\([^~]*\)/"\1"~"\2"/'
或者,使用扩展的正则表达式可能更容易阅读:
sed -E 's/(^[^~]*)~([^~]*)/"\1"~"\2"/'