Я пишу Bash Shellscript. Мне нужно проверить файл, если $ value1 содержит $ value2. $ value1 - это номер столбца (1, 4, 5 в качестве примера), а $ value2 ($ value2 может быть '03', '04', '09' и т.д.) - это строка, которую я ищу. Если столбец содержит $ value2, переместите файл в каталог ошибок. Мне было интересно, как лучше всего это подойти. Я думал awk или есть другой способ?

$ value1 и $ value2 хранятся в файле конфигурации. Я могу контролировать, какой формат использовать. Вот вам пример. Разделитель файлов - Octal \ 036. Я только что изобразил с | ниже.

Примере

$value1=5
$value2=04

Введите example1.txt

 example|42|udajha|llama|04
 example|22|udajha|llama|02 

Введите example2.txt

example|22|udajha|llama|02 

Результат переместите example1.txt в / home / user / error_directory, а example2.txt останется в текущем каталоге (ничего не происходит)

0
Defcon 18 Сен 2018 в 23:28

2 ответа

Лучший ответ

Awk может сообщить, какие файлы соответствуют этому условию:

awk -F"|" -v columnToSearch=$value1 -v valueToFind=$value2 '$columnToSearch==valueToFind{print FILENAME}' example1.txt example2.txt

Тогда вы можете сделать свой mv на основе этого.

Пример использования канала к xargs (с меньшими именами переменных, поскольку вы уже поняли идею):

awk -F"|" -v c=$value1 -v v=$value2 '$c==v{print FILENAME}' example1.txt example2.txt | xargs -I{} mv -i {} /home/user/error_directory
2
JNevill 18 Сен 2018 в 20:42

Если вы пишете сценарий оболочки bash, вы можете разбить его по столбцам с помощью cut. Вариантов действительно так много, что все зависит от того, что вы хотите сделать.

По моему опыту работы с данными, я бы использовал двоеточие, а не вертикальную черту, потому что это позволяет мне избежать выхода с помощью команды «вырезать».

Изменение файлов данных на:

cat example1.txt
example:42:udajha:llama:04
example:22:udajha:llama:02

Я бы написал это так: (добавив -x, чтобы вы могли видеть обработку, но в вашем коде вам не нужно этого делать.)

[root@]# cat mysript.sh
    #!/bin/sh -x
one=`cat example1.txt | cut -d: -f5`
two=`cat example2.txt | cut -d: -f5`

for i in $one
do
if [ $i -eq $two ]
     then
      movethis=`grep $two example1.txt`
      echo $movethis >> /home/me/error.txt
fi
done

cat /home/me/error.txt
[root@]# ./mysript.sh
++ cat example1.txt
++ cut -d: -f5
+ one='04
02 '
++ cat example2.txt
++ cut -d: -f5
+ two=02
+ for i in '$one'
+ '[' 04 -eq 02 ']'
+ for i in '$one'
+ '[' 02 -eq 02 ']'
++ grep 02 example1.txt
+ movethis='example:22:udajha:llama:02 '
+ echo example:22:udajha:llama:02
+ cat /home/me/error.txt
example:22:udajha:llama:02

Вы можете использовать любую живую команду для перемещения вашего контента. Touch, cp, mv, что бы вы там ни использовали.

0
Daniel Hudsky 18 Сен 2018 в 21:15