bash cat исключить несколько файлов на основе результатов grep - PullRequest
0 голосов
/ 07 мая 2020

У меня есть следующая команда cat, которую я использую в сценарии bash. Я ищу файл $ SAMPLE.txt в подпапках 20 * и объединяю их в 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

Я хочу сделать что-то подобное.

Найдите $ SAMPLE и образец «$ PAT1» в файле $ SAMPLEFILE. Этот $ 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 / и справиться с ситуациями где grep приводит к нескольким совпадениям, поэтому следует исключить несколько файлов

1 Ответ

0 голосов
/ 12 мая 2020

Если 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"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...