我有两个文件:
public static string GetStartOfQuery(string databaseName)
{
if (VBS.Left(databaseName, 2) == "AC")
{
return "Select hiredate, terminationdate, employeename, ";
}
else
{
return "Select hiredate, employeename, timeoffaccrued, timeoffused, ";
}
}
public static void BuildAQuery(string databaseName)
{
dao.Database dd;
dao.DBEngine db = new dao.DBEngine();
var qd1 = new dao.QueryDef();
soq = GetStartOfQuery(databaseName);
dd = db.OpenDatabase(SetPath(databaseName));
qd1.Name = String.Format("qry_PersonalInformation");
qd1.SQL = String.Format(startOfQuery + "location", "empID");
dd.QueryDefs.Append(qd1);
}
:
file1
hello,bad,bye
hello,good
bad,please
:
file2
我想提取hello
bye
please
的行,而不是整行:仅列出与file1
中给出的术语匹配的每行的部分。
总结一下,上面两个文件的所需输出是:
file2
我想在hello,bye
hello
please
,bash
或awk
中执行此操作,但我无法想到一种简单/有效的方法。
答案 0 :(得分:3)
答案 1 :(得分:3)
awk
解决方案:阅读file2
中的字词,然后循环浏览file1
中的值。
$ awk -F, 'NR==FNR {a[$1]; next}
{s=""
for (i=1;i<=NF;i++)
if ($i in a) s=(s?s FS:"") $i
print s}' f2 f1
注意它需要一些调整来处理逗号等。如果你不关心尾随空格和逗号,只需使用
awk -F, 'NR==FNR {a[$1]; next} {for (i=1;i<=NF;i++) if ($i in a) printf "%s ",$i; print ""}' f2 f1
$ awk -F, 'NR==FNR {a[$1]; next} {s=""; for (i=1;i<=NF;i++) if ($i in a) s=(s?s FS:"") $i; print s}' f2 f1
hello,bye
hello
please
答案 2 :(得分:1)
要测试的Perl命令行(剪切并粘贴到Unix shell中):
perl -lne 'BEGIN{ local @ARGV=shift; while(<>){ chomp; push @srch, $_ ;}
$rx = join "|", @srch ; $rx = qr/$rx/; }
print join ",", grep { /$rx/ } split/,/, $_ ;' file2 file1
<强>输出:强>
hello,bye
hello
please
该命令类似于@ choroba&#39;仅接受匹配&#34;的条款。从file2
块中读取BEGIN{}
块并将其制作为正则表达式,以及&#34;数据&#34;在file1
开关的implicit while loop中读取-n
中的内容。
@ARGV
shift
BEGIN
file2
while(<>)
%%1
"C:\Path\to\Executable\executable.exe" %%1
可以使用csv
读取totals = {}
for (a,b,c) in list_of_rows:
if (a,b) in totals:
totals[(a,b)] += c
else:
totals[(a,b)] = c
- 这可能有更优雅的习惯用法。