文件比较

时间:2014-05-24 11:40:48

标签: shell columnsorting

我是初学者。我正在寻找一个基本的shell脚本来解决看起来很简单的问题: 我有一个长文件,文件A如下所示:

我想生成一个新文件(目标文件C),它本质上是文件A,但在第一行有一个额外的字段,比如说“注释”,其中第一个字段的项目与任何一个匹配的所有行文件B的第1列中的项目由标记标识,例如“共享”。文件A和B是csv文件

我尝试过awk和一个基本的shell脚本,这对我来说更容易理解,但我无法让它工作。我可以使用目标生成一个空白目标文件  如有必要,第一行包含3个字段。

文件A

"Part Number","Description"
"1468896-1","MCD-MXSER-21-P-X-0209"
"1495581-1","MC-P-15S5127854ST1"
"1497458-3","MC -N1-P-569RT1"

档案B

"1466826-1"
"1495582-1"
"1495581-1"

所需目标文件C

"Part Number","Description","Comment"
"1468896-1","MCD-MXSER-21-P-X-0209"
"1495581-1","MC-P-15S5127854ST1","SHARED"
"1497458-3","MC -N1-P-569RT1"

3 个答案:

答案 0 :(得分:1)

这个单行应该做的工作:

awk -F, -v c='"Comment"' -v s='"SHARED"' 
   'NR==FNR{a[$1]=1;next}FNR==1{$0=$0 FS c}FNR>1&&a[$1]{$0=$0 FS s}7' fileb filea

答案 1 :(得分:0)

你可以这样做:

awk -F, 'FNR==NR{a[i++]=$1;next} {extra="";for(t in a)if($1==a[t])extra=",\"SHARED\"";print $0,extra}' fileB fileA

您将看到fileA和fileB都传递到awk{}之后FNR==NR中的处理仅适用于fileB。它将每行的第一个元素存储在数组a[]中,然后跳到下一行。

第二组{}中的处理仅适用于fileA。基本上它预先设置一个名为extra的字符串为空。然后它测试当前记录的第一个字段是否在数组a[]中。如果是,则将extra设置为",SHARED"。然后它打印当前记录和字符串extra,其可能是,也可能不是,#34;,共享"。

答案 2 :(得分:0)

如果你想在bash中这样做

#!/bin/bash
while IFS=, read f1 line
do
   if grep -qw "$f1" fileB ; then
      echo $f1,$line,\"SHARED\"
   fi
   echo $f1,$line
done < fileA