我有几个文件,每个文件都有不同的列数。我想转换它们以将它们插入到数据库中
例如文件 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',' …Run Code Online (Sandbox Code Playgroud) 我使用此命令查找目录中包含特定字符串的所有文件:
grep -lir "string" path_to directory
Run Code Online (Sandbox Code Playgroud)
例子
grep -lir "users" /var/www/mysite
Run Code Online (Sandbox Code Playgroud)
此命令显示指定目录中包含字符串“users”的所有文件。但是,我想按修改日期降序对它们进行排序;最新到最旧。
有什么帮助吗?
我有一个具有以下格式的文件
INSERT INTO table1(field1,field2,field3) VALUES('values1','value2','value3');
INSERT INTO table1(field1,field2,field3) VALUES('other_values1','other_value2','other_value3');
INSERT INTO table1(field1,field2,field3) VALUES('another_values1','another_value2','another_value3');
INSERT INTO table2(table2_field1,table2_field2,table2_field3,field4) VALUES('table2_values1','table2_value2','table2_value3');
INSERT INTO table2(table2_field1,table2_field2,table2_field3,table2_field4) VALUES('other_table2_values1','other_table2_value2','other_table2_value3');
INSERT INTO table2(table2_field1,table2_field2,table2_field3,table2_field4) VALUES('another_table2_values1','another_table2_value2','another_table2_value3','another_table2_value4');
Run Code Online (Sandbox Code Playgroud)
我想要这个输出
SELECT * FROM table1 WHERE field1='values1' AND field2='values2' AND field3=='values3';
SELECT * FROM table1 WHERE field1='other_values1' AND field2='other_values2' AND field3=='other_values3';
SELECT * FROM table1 WHERE field1='another_values1' AND field2='another_values2' AND field3=='another_values3';
SELECT * FROM table2 WHERE table2_field1='table2_values1' AND table2_field2='table2_values2' AND table2_field3=='table2_values3' AND table2_field4=='table2_values4';
SELECT * FROM table2 WHERE table2_field1='table2_values1' AND table2_field2='table2_values2' AND table2_field3=='table2_values3' AND table2_field4=='table2_values4'; …Run Code Online (Sandbox Code Playgroud) 我想用脚本验证文本文件。
要验证的文件是:
FDFHDK JKL
1545665 152
HDKFHDK UHG
YRYRUBH DFG
867HDKE WER
Run Code Online (Sandbox Code Playgroud)
有效行必须与正则表达式匹配'[A-Z]{7}+[[:space:]]+[A-Z]{3}'。
如果所有行均有效,脚本将显示一条消息,表明文件正常。
如果至少有一行与正则表达式不匹配,则脚本应显示一条消息并显示与正则表达式不匹配的行。
脚本是:
#!/usr/bin/env bash
result=""
output=$(grep -vE '[A-Z]{7}+[[:space:]]+[A-Z]{3}' "$1" |wc -l)
if [[ $output > 0 ]]
then
echo "These lines don't match:"
result="${resultado} $(grep -vE '[A-Z]{7}+[[:space:]]+[A-Z]{3}' "$1") \n"
echo -e $result
else
echo "The text file is valid"
fi
Run Code Online (Sandbox Code Playgroud)
预期输出是
FDFHDK JKL
1545665 152
HDKFHDK UHG
YRYRUBH DFG
867HDKE WER
Run Code Online (Sandbox Code Playgroud)
但我越来越
#!/usr/bin/env bash
result=""
output=$(grep -vE '[A-Z]{7}+[[:space:]]+[A-Z]{3}' "$1" |wc -l)
if [[ $output …Run Code Online (Sandbox Code Playgroud) 我有这个文件:
'dog', 'cat', 'horse', 'turtle'
我想将该行转换为:
dog
cat
horse
turtle
Run Code Online (Sandbox Code Playgroud)
如果我只使用逗号作为分隔符和命令 tr 我可以这样做:
tr -s ',' '\n' < file
与输出
'dog'
'cat'
'horse'
'turtle'
Run Code Online (Sandbox Code Playgroud)
但是当我用作', '分隔符时,这不起作用:
tr -s '\', \'' '\n' < file
即使我使用双反斜杠来转义单引号,它仍然不起作用。我在终端中得到的唯一输出是>.
如何正确转义单引号以获得所需的输出?
我知道使用“ls -l”我可以看到文件或目录的权限,但它用字母显示它们,那么如何以数字方式显示权限
例如:
第755话