首页 > 解决方案 > bash cat 根据 grep 结果排除多个文件

问题描述

我在 bash 脚本中使用了以下 cat 命令。我在子文件夹 20* 中查找 $SAMPLE.txt 文件并将它们组合成 1 个 output.txt

cat /$FOLDER/20*/$SAMPLE.txt > /$OUTPUTFOLDER/output.txt

我现在想有条件地排除某些文件。

我在这里找到了以下内容https://unix.stackexchange.com/questions/246048/cat-files-except-one

$ shopt -s extglob
$ cat -- !(DISCARD).txt > catKEPT

我想做这样的事情。

在 $SAMPLEFILE 中查找 $SAMPLE 和模式“$PAT1”。此 $SAMPLEFILE 以逗号分隔。如果有匹配项,我想存储这一行的第一个字段并使用它从 cat 中排除文件

我将使用此命令查找 $SAMPLE 和 $PAT1 & 然后剪切以保留我的第一个字段。我会将其分配给变量“EXLUDE_FOLDER”

EXCLUDE_FOLDER=grep '$SAMPLE' $SAMPLEFILE | grep '$PAT1' | cut -d "," -f 1

然后像这样使用它

cat /$FOLDER/20*/$SAMPLE.txt -- !($FOLDER/$EXLUDE_FOLDER/$SAMPLE.txt) > /$OUTPUTFOLDER/output.txt

我坚持将其放入 if/statement 并处理 grep 导致多个匹配的情况,因此应排除多个文件

标签: bash

解决方案


如果SAMPLEPAT是变量,您可能希望将它们扩展到其内容,这意味着您必须将它们放在双引号中,而不是单引号中。例子:

SAMPLE=3

# Compare single quotes versus double
echo '$SAMPLE'              # outputs $SAMPLE
echo "$SAMPLE"              # outputs 3

如果SAMPLEFILE是文件名,则必须双引号,否则如果文件名中包含空格,则会失败,因此必须使用:

grep "$SAMPLE" "$SAMPLEFILE"

所以,现在你可以测试你的grep作品是否像这样:

grep "$SAMPLE" "$SAMPLEFILE" | grep "$PAT1" | cut -d "," -f 1

所以,如果这可行,接下来就是你想要捕获命令的输出,所以你需要使用$(...). 这意味着:

EXCLUDE_FOLDER=$(grep "$SAMPLE" "$SAMPLEFILE" | grep "$PAT1" | cut -d "," -f 1)

所以,看看测试现在是否有效:

echo "$EXCLUDE_FOLDER"

推荐阅读