0

我试图在 bash/sed/awk(有用的单行脚本)中解决以下问题。

比较两个或多个文件并仅打印第一个文件中包含相同名称的第二个文件中不存在的单词(模式)的那些行,保留它们出现的顺序并忽略区分大小写。(天哪,听起来如此复杂和愚蠢......我不知道如何用另一个词来表达)。

我有两个不同的文件(file1、file2),其中包含如下信息列表:

文件 1

Agents In The Court / No Love For The Empire
Mercenary Armor
Solo Han WB
Obi-Wan's Journal
Obi-Wan's Lightsaber
No Questions Asked
Do, or do Not
Strike Blocked

文件2

Agents In The Court / No Love For The Empire BB -> (LiGHT SIDE -- Special Cards)    
Mercenary Armor BB -> (LiGHT SIDE -- Device)
Obi-Wan's Journal BB -> (LiGHT SIDE -- Device)
No Questions Asked BB -> (LiGHT SIDE -- Special Cards)
Do, Or Do Not BB -> (LiGHT SIDE -- Defensive Shield)
Strike Planning BB -> (LiGHT SIDE -- Effect)
Alter (Obi-Wan) WB -> (LiGHT SIDE -- Used Interrupt)
Solo Han BB -> (LiGHT SIDE -- Human and Human-Like Characters)
Combined Attack BB -> (LiGHT SIDE -- Lost Interrupt)

结果应该是这样的:

Solo Han WB
Obi-Wan's Lightsaber
Strike Blocked

我将不胜感激任何帮助(完整的解决方案、提示、类似问题的链接等)。

4

4 回答 4

0

我认为不存在单线;您可能需要处理一些临时文件。主意:

# just some boilerplate for handling temp files
t=`mktemp -d -t sort.XXXXXX`
trap "rm -rf $t" EXIT

# add two columns: file-id + line and sort by 3rd field (real data)
nl -ba -nln < file1 | sed -e 's/^/1 /' | sort -k3 >$t/file1
nl -ba -nln < file2 | sed -e 's/^/1 /' | sort -k3 >$t/file2

# get unique lines, filter these from file1, sort by line and give out data
uniq -f 2 $t/file1 $t/file2 | sort -n | cut -d ' ' -f 3-

(未经测试;可能需要对字段分隔符进行一些修复)。

上面的脚本需要比 sed + gawk 更多的工具,但应该可以在最近的 GNU 系统上运行。

于 2013-11-04T23:26:33.723 回答
0

只要 file2 不太大,这些都可以在 bash 中工作:

while read x; do if [[ -z "$(grep -Fi "$x" file2)" ]]; then echo "$x"; fi; done < file1

cat file1 | while read x; do if [[ -z "$(grep -Fi "$x" file2)" ]]; then echo "$x"; fi; done

总体而言,读取 file1 中的每一行并在 file2 中对其进行 grep,仅在未找到匹配项时打印该行。

更详细地说,while read x; do ...; done < file1从 file1 一次读取一行到变量 x 中。搜索 file2以"$(grep -Fi "$x" file2)"查找包含 的内容的行$x,如果未找到匹配项,则评估为空字符串。该-F标志告诉 grep 搜索固定字符串,因此它不会将 的内容$x视为正则表达式。该-i标志表示在搜索时忽略大小写。-z如果其字符串参数为空(即 grep 未找到匹配项),则测试评估为 true。

于 2013-11-05T03:00:37.193 回答
0

适合您需要的简单的东西是内置的差异

diff file1 file2

将打印出两个文件之间不同的所有行

于 2013-11-05T21:12:32.470 回答
0

你也可以试试:

awk -f print.awk file1

print.awk在哪里

BEGIN {
    while (getline < "file2")
        line[i++]=toupper($0)
}

{
    for (j=0; j<i; j++) {
        if (index(line[j],toupper($0))) { 
            f=1; break
        }
    }
    if (!f) print
    f=0
}
于 2013-11-05T23:41:27.310 回答