Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.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
为什么grep可以';是否在shell脚本中筛选正确的行?_Shell_Grep - Fatal编程技术网

为什么grep可以';是否在shell脚本中筛选正确的行?

为什么grep可以';是否在shell脚本中筛选正确的行?,shell,grep,Shell,Grep,代码如下: #!/bin/bash file=$(cat b.txt | tr "[:upper:]" "[:lower:]" | tr -c "[:alnum:]" '\n' | grep -v "^$") cat a.txt | while read line; do file=$(echo "$file" | grep -ov "$line") done echo "$file" | sort | uniq -c | sort -n 上面的a.txt是一个带有段落的文件,b.

代码如下:

#!/bin/bash

file=$(cat b.txt | tr "[:upper:]" "[:lower:]" | tr -c "[:alnum:]" '\n' | grep -v "^$")

cat a.txt | while read line; do
    file=$(echo "$file" | grep -ov "$line")
done
echo "$file" | sort | uniq -c | sort -n
上面的a.txt是一个带有段落的文件,b.txt是一个每行都有一些单词的文件,我只想从a.txt中删除b.txt中的这些单词,而答案是错误的

例如:

b.txt

Hello, i want to go to school
hello
i
a.txt

Hello, i want to go to school
hello
i
预期结果:

  1 go
  1 school
  1 want
  2 to
  1 go
  1 hello
  1 i
  1 school
  1 want
  2 to
实际结果:

  1 go
  1 school
  1 want
  2 to
  1 go
  1 hello
  1 i
  1 school
  1 want
  2 to

而我的答案也包括b.txt中包含的单词。

AWK方法:

awk 'BEGIN {
    FS="[,[:space:]]";
}
{
    if (NR==FNR) {
        for(i=1;i<=NF;++i){
            black[tolower($i)]=1;
        }
        next;
    }
    for (i=1; i<=NF; ++i) {
        if ($i && black[tolower($i)]!=1) {
            target[tolower($i)]+=1;
        }
    }
}
END {
    for (i in target) {
        print target[i], i;
    }
}' a.txt b.txt

AWK进近:

awk 'BEGIN {
    FS="[,[:space:]]";
}
{
    if (NR==FNR) {
        for(i=1;i<=NF;++i){
            black[tolower($i)]=1;
        }
        next;
    }
    for (i=1; i<=NF; ++i) {
        if ($i && black[tolower($i)]!=1) {
            target[tolower($i)]+=1;
        }
    }
}
END {
    for (i in target) {
        print target[i], i;
    }
}' a.txt b.txt

这是典型的子shell变量问题,由cat的无用使用引起。由于您正在将cat管道连接到while循环,并且管道在子shell中运行,因此对变量
文件
的赋值仅影响子shell。不修改原始变量。最简单的解决方法是边读边写
;做完成

第二种解决方案是从子shell回显变量:

cat a.txt | { while read line; do
    file=$(echo "$file" | grep -ov "$line")
done
echo "$file" | sort | uniq -c | sort -n
}

这是典型的子shell变量问题,由cat的无用使用引起。由于您正在将cat管道连接到while循环,并且管道在子shell中运行,因此对变量
文件
的赋值仅影响子shell。不修改原始变量。最简单的解决方法是边读边写
;做完成

第二种解决方案是从子shell回显变量:

cat a.txt | { while read line; do
    file=$(echo "$file" | grep -ov "$line")
done
echo "$file" | sort | uniq -c | sort -n
}

你能添加a.txt、b.txt的示例内容和你预期的结果吗对不起,添加了一个示例。你写的答案是错误的。你能发布正确的预期结果吗?对不起,我弄错了。我现在发布shell生成的答案和我的预期答案。文件中的单词是唯一的吗?然后你可以压缩文件并使用
uniq
选项只输出唯一/重复的单词。你能添加a.txt、b.txt和预期结果的示例内容吗对不起,添加了一个示例。你写的答案是错误的。你能发布正确的预期结果吗?对不起,我弄错了。我现在发布shell生成的答案和我的预期答案。文件中的单词是唯一的吗?然后,您可以对文件进行压缩,并使用
uniq
选项仅输出唯一/重复的单词。非常感谢您给出了正确的答案,而我只想知道我的脚本为什么不起作用。很高兴它有帮助,只是小菜一碟。非常感谢您给出了正确的答案,而我只想知道我的脚本为什么不起作用。很高兴它有帮助,只是小菜一碟。非常感谢,这些解决方案帮助了我。非常感谢,这些解决方案帮助了我。