首页 文章

bash while循环从文件中删除一行

提问于
浏览
0

我有一个我称之为'chuck'的数据集,我需要摆脱一个重复的行,我不想将sed或grep -v用于tmp文件 . 我想使用while循环和模式识别 .

D,642,0642,UBF,FOO,,M,,L,L,HPQ,9926,11080,
D,642,0642,UBF,FOO,,M,,S,S,IBM,11062,5122,
D,642,0642,UBF,FOO,,M,,S,S,INTC,35216,39833,
D,642,0642,UBF,FOO,,M,,S,S,FARFERNUGEN,213,213,
D,642,0642,UBF,FOO,,M,,L,L,JNJ,15607,12714,
D,642,0642,UBF,FOO,,M,,L,L,JPM,51225,40013,

所以我正在捕捉我称之为'chuck'的文件,我试图通过while循环运行它,我试图通过while循环获取每个字符串,除了我想要的字符串 . 我在这做错了什么因为输出完全一样 .

#!/bin/bash
pattern="D,642,0642,UBF,FOO,,M,,S,S,Farfegnugen,213,213,"
cat /tmp/chuck | while read line
do
   [[ ! $s =~ "$pattern" ]] && echo $line
done

2 回答

  • 2

    测试线应该是:

    [[ $line =~ $pattern ]] || echo "$line"
    

    您在测试中使用 $s ,该测试不存在 .

    使用deMorgan定律,您可以从测试中删除 ! 并将布尔运算符更改为 || 以获得相同的效果 .

  • 1

    您的方法存在许多问题,尤其是性能问题 . 我希望等效的 sed -i 脚本比shell循环运行得快很多 .

    但如果你坚持使用shell,你应该:

    • 避免无用 cat ;

    • 请注意,默认情况下 read 会破坏一些输入(使用 read -r );

    • 仍然,根据你的 IFSread 是脆弱的;

    • 引用所有变量,除非您特别要求shell在空格上标记化字符串并在标记上执行通配符扩展;

    • ,显然,如果要测试变量 $line ,请不要测试 $s

    考虑到这些因素,我们获得了

    #!/bin/bash
    pattern="D,642,0642,UBF,FOO,,M,,S,S,DUMOSGI,213,213,"
    IFS='
    '
    while read -r line; do
       [[ ! "$line" =~ $pattern ]] && echo "$line"
    done </tmp/chuck
    

    如果模式是静态的,则使用正则表达式模式匹配是不必要的性能影响 .

相关问题