繁体   English   中英

在Shell脚本中分配变量

[英]Assignment of variables in shell scripting

我正在尝试编写一个shell脚本来模拟以下问题:

文件A包含一些条目,例如

a  
b  
c 

并且文件B包含

a  
g  
d  
t  
q  
c  

最终文件应具有
(文件b中的内容不在文件a中)

g  
d  
t  
q  

我正在尝试类似的事情,但是没有用:

for i in `cat b` ; do if[ (grep $i a) != $i ] then echo $i; done

排序文件,然后使用comm bash

comm -13 <(sort a) <(sort b)

假设您的bash足够新(Mac OS X 10.7.3上的3.2版本还不够新; 4.1可以),并且文件是ab <(sort a)是进程替换; 它在a上运行sort ,并将输出作为第一个文件发送到comm 类似地用于<(sort b) comm -13选项仅在第一个文件( 1 ,又名a )和两个文件( 3 )中禁止显示行,因此仅在2b保留行。

您的命令:

for i in `cat b` ; do if[ (grep $i a) != $i ] then echo $i; done

显示了许多问题-四个单独的语法问题:

  1. [
  2. 之前的美元(
  3. echo前的分号
  4. fi; done之前

修复它们可以得到:

for i in `cat b`; do if [ $(grep $i a) != $i ]; then echo $i; fi; done

您还可以使用:

for i in `cat b`
do
    if grep $i a > /dev/null
    then : in both files
    else echo $i
    fi
done

您的代码有一些错误:

  1. 忘记了if语句的关闭:fi

  2. “ grep $ ia”必须解释为命令,例如$(grep $ ia)或`grep $ ia`

  3. 您必须在$(grep $ ia)周围添加一些字符,以避免空字符串比较,例如“:”或其他任何东西。

解:

for i in `cat b` ; do if [ :$(grep $i a) != :$i ] ;then echo $i;fi; done

假设AB是您的文件,可以通过diff完成

diff A B | grep '^>' | cut -d ' ' -f 2-
pearl.260> cat file3
i
a
b
c
pearl.261> cat file4
a
g
d
t
q
c
pearl.262> nawk 'FNR==NR{a[$1];next}!($1 in a)' file3 file4
g
d
t
q
pearl.263>

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM