小编Emi*_*aga的帖子

如何使用 NF 和 for 循环优化脚本

我有几个文件,每个文件都有不同的列数。我想转换它们以将它们插入到数据库中

例如文件 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)

awk csv columns

4
推荐指数
2
解决办法
5071
查看次数

搜索包含字符串的文件并列出按修改日期排序的名称

我使用此命令查找目录中包含特定字符串的所有文件:

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”的所有文件。但是,我想按修改日期降序对它们进行排序;最新到最旧。

有什么帮助吗?

grep find date sort files

3
推荐指数
1
解决办法
1894
查看次数

将插入转换为选择

我有一个具有以下格式的文件

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)

sed awk text-processing sql

3
推荐指数
1
解决办法
361
查看次数

在 bash 脚本中的 if 语句内显示带有换行符的 grep 输出

我想用脚本验证文本文件。

要验证的文件是:

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)

grep bash shell-script regular-expression

3
推荐指数
1
解决办法
1000
查看次数

将包含用单引号括起来并用逗号分隔的单词的行转换为列

我有这个文件:
'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

即使我使用双反斜杠来转义单引号,它仍然不起作用。我在终端中得到的唯一输出是>.

如何正确转义单引号以获得所需的输出?

sed awk text-processing tr

3
推荐指数
1
解决办法
1494
查看次数

如何以数字格式显示权限?

我知道使用“ls -l”我可以看到文件或目录的权限,但它用字母显示它们,那么如何以数字方式显示权限

例如:

第755话

ls files

1
推荐指数
1
解决办法
5387
查看次数

标签 统计

awk ×3

files ×2

grep ×2

sed ×2

text-processing ×2

bash ×1

columns ×1

csv ×1

date ×1

find ×1

ls ×1

regular-expression ×1

shell-script ×1

sort ×1

sql ×1

tr ×1