bash - 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 导致多个匹配的情况,因此应排除多个文件
解决方案
如果SAMPLE
和PAT
是变量,您可能希望将它们扩展到其内容,这意味着您必须将它们放在双引号中,而不是单引号中。例子:
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"
推荐阅读
- php - 使用 Or-Tools 的车辆路线问题 - 自动决定初始起点
- reactjs - 反应高图表不显示情节线
- javascript - 如何从内部图像onLoad返回变量
- c# - c#:通过电子邮件批准/拒绝:不是按钮:最少点击
- jquery - 卡在带有复选框的jquery中
- c# - MailKit.Net.Imap.ImapProtocolException:“IMAP 服务器问候语中的语法错误。意外的令牌:[atom:OK]”
- java - java - 如何随机生成0到3之间的整数而不使它们在Java中连续?
- bash - 从 Jenkins 的 .property 文件中读取数据并使用 Shell 脚本进行解析
- python - Python:尽管变量被定义为整数,为什么变量被视为“NoneType”?
- javascript - JQuery UI 对话框:TypeError: a(...).parents(...).andSelf is not a function