2015-04-21 81 views
0

我有两个文本文件:查找两个文本文件的重复单词,使用命令行

f1.txt 

boom Boom pow 
Lazy dog runs. 
The Grass is Green 
This is TEST 
Welcome 

f2.txt 

Welcome 
I am lazy 
Welcome, Green 
This is my room 
Welcome 
bye 

在Ubuntu的命令行我想:

awk 'BEGIN {RS=" "}FNR==NR {a[$1]=NR; next} $1 in a' f1.txt f2.txt 

和获得输出:

Green 
This 
is 

我所需的输出是:

lazy 
Green 
This is 
Welcome 

说明:我想比较两个txt文件,一行行。然后我想输出所有重复的单词。比赛应该不区分大小写。此外,逐行比较会更好,而不是在整个f2.txt文件中查找来自f1.txt的匹配。例如,如果它是在第6行而不是在f2.txt中的第5行,则“欢迎”这个词不应该在期望的输出中

回答

2

那么。使用awk:

awk 'NR == FNR { for(i = 1; i <= NF; ++i) { a[NR,tolower($i)] = 1 }; next } { flag = 0; for(i = 1; i <= NF; ++i) { if(a[FNR,tolower($i)]) { printf("%s%s", flag ? OFS : "", $i); flag = 1 } } if(flag) print "" }' f1.txt f2.txt 

这种工作方式如下:

NR == FNR {         # While processing the first file: 
    for(i = 1; i <= NF; ++i) {    # Remember which fields were in 
    a[NR,tolower($i)] = 1     # each line (lower-cased) 
    } 
    next          # Do nothing else. 
} 
{           # After that (when processing the 
              # second file) 
    flag = 0         # reset flag so we know we haven't 
              # printed anything yet 
    for(i = 1; i <= NF; ++i) {    # wade through fields (words) 
    if(a[FNR,tolower($i)]) {    # if this field was in the 
              # corresponding line in the first 
              # file, then 
     printf("%s%s", flag ? OFS : "", $i) # print it (with a separator if it 
              # isn't the first) 
     flag = 1        # raise flag 
    } 
    } 
    if(flag) {        # and if we printed anything 
    print ""        # add a newline at the end. 
    } 
} 
+0

谢谢你,你是惊人的!如果我想用RegEx来描述“单词”是什么?就我而言,它是'\ w *( - )*(\ w +)'。因为当我接收到用来运行这个命令的大量复杂文本的输出时,并非所有东西都是一个字 – pnb1

+1

您可以通过给awk提供'-F'选项和一个合适的正则表达式来调整字段分隔符。该行将在该字段分隔符的出现处被拆分为字段。例如,用'-F'[,:#] +'',你可以将'foo bar,#baz :: qux'解析成'foo','bar','baz'和'qux'四个字段。 – Wintermute

+1

我没有先看这个,看看我想出了什么,以及我最终以几乎相同的解决方案。唯一真正的功能差异是我有'BEGIN {FS =“[^ [:alpha:]] +”}'来处理输入中的逗号和句点,因为我认为单词只包含字母字符(OP可以更正如果这是错误的,添加新的“单词”组成字符)。 –

相关问题