我是初学者。我正在寻找一个基本的shell脚本来解决看起来很简单的问题: 我有一个长文件,文件A如下所示:
我想生成一个新文件(目标文件C),它本质上是文件A,但在第一行有一个额外的字段,比如说“注释”,其中第一个字段的项目与任何一个匹配的所有行文件B的第1列中的项目由标记标识,例如“共享”。文件A和B是csv文件
我尝试过awk和一个基本的shell脚本,这对我来说更容易理解,但我无法让它工作。我可以使用目标生成一个空白目标文件 如有必要,第一行包含3个字段。
"Part Number","Description"
"1468896-1","MCD-MXSER-21-P-X-0209"
"1495581-1","MC-P-15S5127854ST1"
"1497458-3","MC -N1-P-569RT1"
"1466826-1"
"1495582-1"
"1495581-1"
"Part Number","Description","Comment"
"1468896-1","MCD-MXSER-21-P-X-0209"
"1495581-1","MC-P-15S5127854ST1","SHARED"
"1497458-3","MC -N1-P-569RT1"
答案 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