1

我有两个文本文件zero.txtvalue.txt.

零.txt:

hour Value1  value2  
0        0       0
1        0       0
2        0       0
3        0       0
4        0       0

最多 24 个。

和 value.txt:

hour Value1  value2  
0        1       1
2        2       2
4        3       4 

我想比较两个文件中的第一列(实际上第一列是 0-24 小时)。如果values.txt有小时值,我需要打印该行,output.txt如果没有值,我需要打印小时,在output.txt. 如下所示:

output.txt

hour Value1  value2  
0        1       1
1        0       0
2        2       2
3        0       0
4        3       4 

这个unix怎么实现?

4

4 回答 4

4

您可以使用join命令。

join -o 1.1,2.2,2.3 -a 1 -e 0 zero.txt value.txt
于 2013-06-08T23:30:17.983 回答
4

这就是你想要的:

$ awk 'NR==FNR{a[$1]=$0;next}($1 in a){print a[$1];next}{print $0}' value zero
hour Value1  value2
0        1       1
1        0       0
2        2       2
3        0       0
4        3       4

解释:

脚本的结构是awk形式中的一系列条件句和块conditional{block}。每个在输入中读取的记录执行脚本,如果条件被评估为真,则块中的代码将被执行。一个简单的例子是awk '/hour/{print $0}' value输入是文件并且在文件的每一行上执行value的脚本。/hour/{print $0}这里的条件是字符串的正则表达式匹配,hour因为只有文件中的第一行匹配,它将是输出中打印的唯一行。

  • NR是一个特殊awk变量,每次读取记录都会递增。默认情况下,记录在awk. FNR几乎相同,但每次读取新文件时都会重置。所以这个条件NR==FNR只有在我们读取第一个文件时才成立value
  • a[$1]=$0正在使用第一个字段作为键创建行查找。
  • next抓取文件中的下一行,跳过以下块。
  • 当第二个文件被读取时,我们检查第一个字段是否是我们从第一个文件创建的查找,($1 in a)如果是,我们打印该值并获取下一行。
  • 如果第一个字段不是数组中的键,我们将打印我们正在查看的文件中的行zero

使用一些awk idiums我们可以缩短脚本,但在开始时最好是冗长的:

awk 'NR==FNR{a[$1]=$0;next}$1 in a{$0=a[$1]}1' value zero

您应该从阅读有效的 awk 编程开始。

于 2013-06-08T21:15:23.073 回答
1

一种使用

内容script.vim

set backup
buffer 2
2,$ yank 
buffer 1
2 put!
2,$ ! sort -sun -k1,1
saveas! output.txt
qa!

像这样运行它:

vim -u NONE -N -S script.vim zero.txt value.txt

并将创建一个以output.txt内容命名的文件:

hour Value1  value2  
0        1       1
1        0       0
2        2       2
3        0       0
4        3       4

它是如何工作的?它复制 的内容values.txt,将其全部粘贴在 的标题之后,zero.txt然后按第一列删除重复项对其进行排序。

于 2013-06-08T22:24:01.617 回答
-2

如果我们忽略标题并使用 bash 脚本(您需要调整边距):

while read x1 x2 x3
do
    if grep -q "^$x1\>" value.txt
    then
        grep "^$x1\>" value.txt >> output.txt
    else
        echo "$x1      $x2       $x3" >> output.txt
    fi
done < zero.txt
于 2013-06-08T21:26:12.230 回答