使用第二个文件中的模式从文件中提取数据

时间:2015-04-30 14:50:49

标签: bash perl awk

我有两个文件:

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 bashawk中执行此操作,但我无法想到一种简单/有效的方法。

3 个答案:

答案 0 :(得分:3)

Perl解决方案。将已知单词保留在哈希中,使用split从逗号分隔列表中提取元素,并使用grep对其进行过滤。

datefield >= DATE('2014-01-01')

答案 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 - 这可能有更优雅的习惯用法。