Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/drupal/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Shell 文件比较_Shell_Columnsorting - Fatal编程技术网

Shell 文件比较

Shell 文件比较,shell,columnsorting,Shell,Columnsorting,我是初学者。我正在寻找一个基本的shell脚本来解决一个看似简单的问题: 我有一个长文件,文件A如下所示: 我想生成一个新文件(目标文件C),它本质上是文件a,但在第一行上有一个额外的字段,如“Comment”,其中第一个字段中与文件B第1列中的任何项目匹配的所有行都由一个标记标识,如“SHARED”。文件A和B是csv文件 我尝试过awk和一个对我来说更容易理解的基本shell脚本,但我无法让它工作。我可以生成一个空白的目标文件,目标 如有必要,包含3个字段的第一行 归档 文件B 所需目标文件

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

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

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

归档 文件B 所需目标文件C
您可以这样做:

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
后面的
{}
中的处理仅适用于文件B。它将每行的第一个元素存储在数组
a[]
中,然后跳到下一行


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

这一行可以完成以下任务:

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

如果你想在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
#/bin/bash
当IFS=时,读取f1行
做
如果grep-qw“$f1”文件b;然后
echo$f1,$line,\“共享”
fi
echo$f1,$line
完成

注1,这不会生成
注释“
标题;注意2,您可以使用
$1
作为数组索引,然后您可以将其从
O(n*m)->O(n+m)
not3,您没有设置
OFS
,这没关系,但是您
打印$0,额外的
,它将在硬编码逗号
之前添加一个额外的空格,
@Kent感谢您的见解。我遇到了这个问题-我需要一个lop来测试$1是否在a[]中,尽管之前我刚刚编写了
if($1在a中)
它在这里根本不起作用!不知道为什么?与其使用
a[i++]=$1
不如使用
a[$1]
而且
i++
将使第一个索引
0
,几乎所有编程语言都可以,但是数组从
1
开始,使用awk约定对于像我这样的初学者来说,bash更友好一些,因此看起来更灵活。然而,谈到速度,awk是令人讨厌的。这里没有必要。
awk -F, 'FNR==NR{a[i++]=$1;next} {extra="";for(t in a)if($1==a[t])extra=",\"SHARED\"";print $0,extra}' fileB fileA
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
#!/bin/bash
while IFS=, read f1 line
do
   if grep -qw "$f1" fileB ; then
      echo $f1,$line,\"SHARED\"
   fi
   echo $f1,$line
done < fileA