说我有两个看起来像这样的数据文件。
A dog 3
A cat 1
A mouse 4
A chicken 4
和
B tiger 2
B chicken 1
B dog 3
B wolf 2
我怎样才能只查看两个文件中常见的动物?理想情况下,我希望输出看起来像
dog 3 3
chicken 4 1
但即使输出两个文件中常见的值及其值也足够了。感谢。
答案 0 :(得分:1)
这个单行应该做:
awk 'NR==FNR{a[$2]=$2 FS $3;next}a[$2]{print a[$2],$3}' f1 f2
答案 1 :(得分:1)
@Kent做了一些严肃的一线魔法。无论如何,我做了一个你可以尝试的shell脚本。只需运行./script[file1] [file2]
#!/bin/bash
# Read input
words1=$(cat $1 | sed -r "s/.*\ (.*)\ .*/\1/")
val1=$(cat $1 | sed -r "s/.*\ .*\ (.*)/\1/")
words2=$(cat $2 | sed -r "s/.*\ (.*)\ .*/\1/")
val2=$(cat $2 | sed -r "s/.*\ .*\ (.*)/\1/")
# Convert to array
words1=($words1)
val1=($val1)
words2=($words2)
val2=($val2)
# Iterate and print result
for i in "${!words1[@]}"; do
for j in "${!words2[@]}"; do
if [ ${words1[i]} == ${words2[j]} ]; then
echo "${words1[i]} ${val1[i]} ${val2[j]}"
break
fi
done
done
exit 0
答案 2 :(得分:0)
我不确定为什么这是linux / unix问题。看起来你需要的是一个你需要编写的简单程序,因为这不是一个基本的比较双文件问题,通常会被Beyond Compare等应用程序所覆盖。
假设这些文件是基本文本文件,每行包含一个带空格分隔值的记录。 (使用空格作为分隔符很危险,但这就是你上面的内容)。您需要读入每个文件,将这两个文件存储为[可迭代集合],并让每个对象成为您在循环的每次运行中执行的字符串,或者在从文件构建时分成几个部分。您需要将第一个文件中的[linepart 1]与第二个文件中的每个[linepart 1]进行比较,每当找到匹配项时,断开并输出[linepart 1] [A.linepart 2] [B.linepart 2 ]
我想不出任何可以为你做这个的现有程序,但它很简单(假设你认为文件IO很简单)来处理Java,C#等。