有谁知道如何将文件名和文件的其余内容传递给awk?并让它运行目录中的所有文件,并将这些操作的输出附加到1个最终文件?
我需要每周根据2个变量生成一个SQL更新文件,并且我曾经将大量粘贴复制到CSV文件中以获取此awk命令。我的设置是这样的:
非常长的手动粘贴在一起的CSV,第1行看起来像这样:
3afb6dad-352d-4c2a-b348-40fdb3c3d9a6;019f08dd-5017-43a1-b65b-c77cb90068ab
通过CSV运行的AWK命令:
cat list.csv | awk -F\; '{print "update db01.CONTENT set locationid = \"" $1 "\" where cdbid = \"" $2 "\";";'}
我希望通过自动生成CSV文件来实现自动化,甚至可以通过将正确的变量直接传递给脚本来实现更好。
我有几个输入文件。在我的awk命令中,文件的标题必须是$1
并且是常量。文件本身包含可变数量的UUID,需要$2
我有一个名为3afb6dad-352d-4c2a-b348-40fdb3c3d9a6
的文件。该文件的内容如下所示:
019f08dd-5017-43a1-b65b-c77cb90068ab
0479c914-6988-4038-ac74-f5b4adb123d0
05a6b05a-dff9-4f7c-8a7e-92c8651b8cde
05ad4a6a-e2c6-4074-adfd-0899c15a3600
204b12af-42d8-48a0-83c6-10e02a051ed5
20c4fb93-6ed2-4dee-87da-749b52c76d74
27b2552a-1050-47fb-96fe-714b4231a067
343f34be-b1cf-4cdf-8c35-344847a13837
我有另一个名为72d799e8-ff97-4388-a498-47badd6ca7d8
的文件,其中包含以下内容:
54b0623f-b5f0-47a1-bf90-9c8cb2054676
8056e400-b809-4e08-bf0a-d5370f3e1b44
我需要的是获取包含以下内容的.sql文件:
update db01.CONTENT set locationid="3afb6dad-352d-4c2a-b348-40fdb3c3d9a6" where cdbid ="019f08dd-5017-43a1-b65b-c77cb90068ab";
update db01.CONTENT set locationid ="3afb6dad-352d-4c2a-b348-40fdb3c3d9a6" where cdbid="0479c914-6988-4038-ac74-f5b4adb123d0";
update db01.CONTENT set locationid ="3afb6dad-352d-4c2a-b348-40fdb3c3d9a6" where cdbid="05a6b05a-dff9-4f7c-8a7e-92c8651b8cde";
update db01.CONTENT set locationid ="3afb6dad-352d-4c2a-b348-40fdb3c3d9a6" where cdbid="05ad4a6a-e2c6-4074-adfd-0899c15a3600";
update db01.CONTENT set locationid ="3afb6dad-352d-4c2a-b348-40fdb3c3d9a6" where cdbid="204b12af-42d8-48a0-83c6-10e02a051ed5";
update db01.CONTENT set locationid ="3afb6dad-352d-4c2a-b348-40fdb3c3d9a6" where cdbid="20c4fb93-6ed2-4dee-87da-749b52c76d74";
update db01.CONTENT set locationid ="3afb6dad-352d-4c2a-b348-40fdb3c3d9a6" where cdbid="27b2552a-1050-47fb-96fe-714b4231a067";
update db01.CONTENT set locationid ="3afb6dad-352d-4c2a-b348-40fdb3c3d9a6" where cdbid="343f34be-b1cf-4cdf-8c35-344847a13837";
update db01.CONTENT set locationid ="72d799e8-ff97-4388-a498-47badd6ca7d8" where cdbid="54b0623f-b5f0-47a1-bf90-9c8cb2054676";
update db01.CONTENT set locationid ="72d799e8-ff97-4388-a498-47badd6ca7d8" where cdbid="8056e400-b809-4e08-bf0a-d5370f3e1b44";
我尝试了一些尝试组合的东西
for file in ./output/*;
do
echo ${file##*/}
done
和
while IFS='' read -r line || [[ -n "$line"]];
do
#awk stuff
done <"$1"
但我无法得到任何结果。所有的帮助表示赞赏!
答案 0 :(得分:1)
使用纯bash的一种解决方案:
#!/bin/bash
cd ./output
for file in *; do
while read -r line; do
echo 'update db01.CONTENT set locationid="'$file'" where cdbid ="'$line'";'
done < $file
done
update db01.CONTENT set locationid="3afb6dad-352d-4c2a-b348-40fdb3c3d9a6" where cdbid ="019f08dd-5017-43a1-b65b-c77cb90068ab";
update db01.CONTENT set locationid="3afb6dad-352d-4c2a-b348-40fdb3c3d9a6" where cdbid ="0479c914-6988-4038-ac74-f5b4adb123d0";
update db01.CONTENT set locationid="3afb6dad-352d-4c2a-b348-40fdb3c3d9a6" where cdbid ="05a6b05a-dff9-4f7c-8a7e-92c8651b8cde";
update db01.CONTENT set locationid="3afb6dad-352d-4c2a-b348-40fdb3c3d9a6" where cdbid ="05ad4a6a-e2c6-4074-adfd-0899c15a3600";
update db01.CONTENT set locationid="3afb6dad-352d-4c2a-b348-40fdb3c3d9a6" where cdbid ="204b12af-42d8-48a0-83c6-10e02a051ed5";
update db01.CONTENT set locationid="3afb6dad-352d-4c2a-b348-40fdb3c3d9a6" where cdbid ="20c4fb93-6ed2-4dee-87da-749b52c76d74";
update db01.CONTENT set locationid="3afb6dad-352d-4c2a-b348-40fdb3c3d9a6" where cdbid ="27b2552a-1050-47fb-96fe-714b4231a067";
update db01.CONTENT set locationid="3afb6dad-352d-4c2a-b348-40fdb3c3d9a6" where cdbid ="343f34be-b1cf-4cdf-8c35-344847a13837";
update db01.CONTENT set locationid="72d799e8-ff97-4388-a498-47badd6ca7d8" where cdbid ="54b0623f-b5f0-47a1-bf90-9c8cb2054676";
update db01.CONTENT set locationid="72d799e8-ff97-4388-a498-47badd6ca7d8" where cdbid ="8056e400-b809-4e08-bf0a-d5370f3e1b44";
答案 1 :(得分:1)
awk
救援!
基于您的输入/输出文件格式
$ awk '{file=FILENAME; sub(".*/", "", file);
print "update db01.CONTENT set locationid=\"" file
"\" where cdbid=\"" $1 "\""}' output/*
答案 2 :(得分:0)
不是awk
,但这是一个perl单行:
perl -ne 'chomp; print "update db01.CONTENT set locationid=\"$ARGV\" where cdbid=\"$_\";\n";' * > whatever.sql
我制作了一个包含两个文件的测试目录,其中包含以下内容:
in1 :(类似于3afb6dad-352d-4c2a-b348-40fdb3c3d9a6
)
out1 (analogous to 019f08dd-5017-43a1-b65b-c77cb90068ab)
out2 (analogous to 0479c914-6988-4038-ac74-f5b4adb123d0)
in2 :(类似于72d799e8-ff97-4388-a498-47badd6ca7d8
)
out3 (analogous to 54b0623f-b5f0-47a1-bf90-9c8cb2054676)
out4 (analogous to 8056e400-b809-4e08-bf0a-d5370f3e1b44)
当我使用Perl 5.22运行上述内容时,我得到:
update db01.CONTENT set locationid="in1" where cdbid="out1";
update db01.CONTENT set locationid="in1" where cdbid="out2";
update db01.CONTENT set locationid="in2" where cdbid="out3";
update db01.CONTENT set locationid="in2" where cdbid="out4";
我认为这与你想要的类似。
修改 -n
开关围绕给定命令提供while(<>){ ... }
。
因此,perl处理命令行上给出的每个文件,一次一行。在脚本(隐式循环体)中,$_
是行,$ARGV
是它来自的文件的名称(reference)。 chomp
从$_
中删除尾随换行符,然后print
语句输出所需的SQL。所有输出都由shell保存到whatever.sql
。
答案 3 :(得分:0)
正如我在评论中写的那样,创建一个只用于awk
的CSV中间文件是没有意义的。如果您可以创建这样的文件,那么您也可以直接创建所需的SQL脚本。例如:
#!/bin/bash
for file in ./output/*;
do
location=$(basename "$file")
while read cb <"$file"; do
echo "update db01.CONTENT set locationid=\"${location}\" where cdbid =\"${cb}\";"
done
done
该版本将结果写入标准输出。您可以将其重定向到您想要的位置,或者将所需的重定向放入脚本中。