Как разделить имена файлов и содержимое, соответствующие определенному шаблону, в разных файлах - PullRequest
2 голосов
/ 10 апреля 2019

Я пытаюсь разделить имена файлов, соответствующие определенному, в отдельный файл, а его содержимое - в разные файлы, соответствующие определенному шаблону. У меня есть имена файлов со специальными символами, такими как '|'

Я пытался использовать команду grep. Grep Ril и Grep -H, чтобы напечатать имена файлов, но это не работает.

#!bin/bash
cd home/test
let "x = 1"
for file in $(find home/test/* -type f -name "*.txt") ; 
do
var=$(echo "${x}|fill|${file##*/}")
echo "${var}" | grep -n "*|fill|*.txt" >header.txt
myvar=$(sed 's/^/'${x}'|/g' ${file})
echo "${myvar}" |grep -n "*|Ball|*" >Ball.txt
echo "${myvar}" |grep -n "*|Fire|*" >Fire.txt
let x=x+1
done
unset 'x'
let x=x+1
done
unset 'x

У меня есть имена файлов в этом формате:

1|fill|abc.txt
2|fill|def.txt

Заполнение остается одинаковым во всех файлах. Конечный файл для этого должен иметь значения, подобные этому

1|fill|abc.txt
2|fill|def.txt
3...
4...
5...
etc...

Затем каждый файл содержит различное содержимое.

Файл1 содержит данные, аналогичные этому шаблону:

1|Ball|202029|
1|Cat|202029|
1|fire|202898
...

Файл 2 содержит данные, аналогичные этому шаблону:

2|Bat|202029|
2|Ball|202029|
2|cat|202898

Теперь окончательный вывод должен быть таким, чтобы все данные, содержащие «ball», были в отдельном файле, «cat» в отдельном файле, «fire» в отдельном файле и т. Д.

1 Ответ

0 голосов
/ 10 апреля 2019

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

нижеуказанные файлы будут находиться в том же каталоге, что и другие файлы, которые вы используете в скрипте, и по окончании .txt также будут считаны и при следующем запуске скрипта.

header.txt
B.txt
C.txt
F.txt
#!/bin/bash


# i put the directory in variable, so it can be changed at a single place.
dir='/home/test'

#if cd failed , print erron on standard error output and terminate script.
if ! cd "${dir}" ;then
        echo "cd failed into ${dir}" >&2
        exit 1
fi

# set counter to 1
let "x = 1"

# Null file contents or create new file
# without this file content will be preserved from earlier script runs.
> header.txt
> B.txt
> C.txt
> F.txt

# go trhought every file in ${dir} path that name end with .txt and it is a regular file
for file in $(find ${dir} -type f -name "*.txt") ;
do
        # store basefilename in variable with aditional counter number and text |Fill| front of it.
        filename=$(echo "${x}|fill|${file##*/}")
        echo "${filename}" >> header.txt
        # this can be used as well:
        ##echo "${x}|fill|${file##*/}" >> header.txt
        # only difference is you stored the output into variable.

        # find matching line in files
        grep -i '|Ball|' ${file} | sed 's/^/'${x}'|/g' >> B.txt
        grep -i '|Cat|'  ${file} | sed 's/^/'${x}'|/g' >> C.txt
        grep -i '|Fire|' ${file} | sed 's/^/'${x}'|/g' >> F.txt

        # add 1 to counter
        let "x=x+1"
done

# unset counter
unset 'x'

Входные файлы:

FILE1.TXT

1|Ball|202029|
1|Cat|202029|
1|fire|202898

file2.txt

2|Bat|202029|
2|Ball|202029|
2|cat|202898

Выходные файлы:

header.txt

1|fill|header.txt
2|fill|B.txt
3|fill|C.txt
4|fill|F.txt
5|fill|File1.txt
6|fill|File2.txt

b.txt

5|1|Ball|202029|
6|2|Ball|202029|

C.txt

5|1|Cat|202029|
6|2|cat|202898

F.txt

5|1|fire|202898
...