我有一个数据集,我称之为“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
答案 0 :(得分:2)
测试线应该是:
[[ $line =~ $pattern ]] || echo "$line"
您在测试中使用的是$s
,但该测试并不存在。
使用deMorgan定律,您可以从测试中删除!
并将布尔运算符更改为||
以获得相同的效果。
答案 1 :(得分:1)
您的方法存在许多问题,其中最重要的是性能问题。我希望等效的sed -i
脚本比shell循环运行得快得多。
但如果你坚持使用shell,你应该:
cat
; read
会破坏某些输入(使用read -r
); IFS
,read
是脆弱的; $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
如果模式是静态的,使用正则表达式模式匹配是不必要的性能损失。