我有几个文件,每个文件都有不同的列数。我想转换它们以将它们插入到数据库中
例如文件 test01:
0001 000000000000001 john smith 45 500
0002 000000000000002 peter jackson 20 80
0003 000000000000002 robert brown 35 100
0004 000000000000007 sarah white 40 300
Run Code Online (Sandbox Code Playgroud)
我想要的输出是:
('0001','000000000000001','john smith','45','500'),
('0002','000000000000002','peter jackson','20','80'),
('0003','000000000000002','robert brown','35','100'),
('0004','000000000000007','sarah white','40','300');
Run Code Online (Sandbox Code Playgroud)
为了实现这一点,我使用以下脚本:
cat test01 |awk -F'\t' '{print "('\''"$1"'\'','\''"$2"'\'','\''"$3"'\'','\''"$4"'\'','\''"$5"'\''),"}' |sed '$ s/.$/;/'
Run Code Online (Sandbox Code Playgroud)
它工作正常,问题是当我找到另一个具有不同列数的文件时,所以我必须手动修改脚本。
我知道我可以通过 AWK 的变量 NF 获得列数,但是如何将此变量与脚本中的 for 循环结合起来?
当我尝试
cat test01 | awk '{for (i = 1; i <= NF; i++){print $i"'\'','\''"}}'
Run Code Online (Sandbox Code Playgroud)
我得到这个结果:
0001','
000000000000001','
john','
smith','
45','
500','
0002','
000000000000002','
peter','
jackson','
20','
80','
0003','
000000000000002','
robert','
brown','
35','
100','
0004','
000000000000007','
sarah','
white','
40','
300','
Run Code Online (Sandbox Code Playgroud)
如果您的输入文件是制表符分隔的,您可以尝试以下操作:
awk -F"\t" -vq="'" -vOFS="','" '$1=$1 {print "(" q $0 q ");"}' filename
Run Code Online (Sandbox Code Playgroud)
或者在打印函数中嵌入引号:
awk -F"\t" -vOFS="','" '$1=$1 {print "(" "\x27" $0 "\x27" ");"}' filename
Run Code Online (Sandbox Code Playgroud)
使用 GNU sed:
$ sed -e "s/^/('/" -e "s/\t/','/g" -e "s/$/'),/" -e '$s/.$/;/' file
('0001','000000000000001','john smith','45','500'),
('0002','000000000000002','peter jackson','20','80'),
('0003','000000000000002','robert brown','35','100'),
('0004','000000000000007','sarah white','40','300');
Run Code Online (Sandbox Code Playgroud)
该sed脚本分为四个部分:
s/^/('/将行首替换为('.s/\t/','/g将选项卡替换为','. 这是需要 GNU 的部分sed。对于其他sed实现,请插入文字制表符来代替\t。s/$/'),/将行尾替换为'),.$s/.$/;/(仅)用 替换最后一行末尾的逗号;。