Как я могу разделить файл, чтобы получить параметры с оболочкой? - PullRequest
0 голосов
/ 17 января 2020

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

20191224900|1
20191230901|1
20200107905|1
2020020891|1
2020010984|1

Например, первая строка должна быть разделена следующим образом

19
12 
24 
900

вторая строка должна быть разделена следующим образом

19 
12
30
901

Для каждого l oop эти числа должны иметь параметры в другой оболочке

Пример:

another_shell $19 $12 $30 $901

Но когда я запускаю тест, единственный результат, который у меня есть это файл, разделенный на столбцы, и мне нужно применить разделение для каждой строки отдельно и отправить параметры

while read line; 
do 
    echo "year"
    awk '{print substr($1,3,2)}'
    echo "month"
    awk '{print substr($1,5,2)}' 
    echo "day"
    awk '{print substr($1,7,2)}' 
    echo "store"
    sed 's/|1//' REPROCESO_VTA_20200107.txt | awk '{print substr($1,9,3)}'
done < REPROCESO_VTA_20200107.txt

Ответы [ 2 ]

0 голосов
/ 18 января 2020

Идея ужасно от agile: просто добавьте пробел. Предполагая, что ваш another_shell на самом деле не оболочка, а просто какая-то команда, вы можете сделать что-то вроде:

$ cat a.sh
#!/bin/sh

cat << EOF |
20191224900|1
20191230901|1
20200107905|1
2020020891|1
2020010984|1
EOF
sed -E 's/(..)(..)(..)(..)([^|]*)/\1 \2 \3 \4 \5 /' |
while read _ one two thre four _; do
        echo "$one" "$two" "$thre" "$four"
done
$ ./a.sh
19 12 24 900
19 12 30 901
20 01 07 905
20 02 08 91
20 01 09 84

Замените echo в приведенном выше тексте на another_shell и все готово.

0 голосов
/ 17 января 2020

В вашем коде ...

while read line; 
do 
    echo "year"
    awk '{print substr($1,3,2)}'
    echo "month"
    awk '{print substr($1,5,2)}' 
    echo "day"
    awk '{print substr($1,7,2)}' 
    echo "store"
    sed 's/|1//' REPROCESO_VTA_20200107.txt | awk '{print substr($1,9,3)}'
done < REPROCESO_VTA_20200107.txt

... вы говорите sed обрабатывать весь входной файл на каждой итерации l oop. Это полностью отделено от оболочки, читающей одну строку из одного и того же файла на каждой итерации с помощью команды read. Поскольку ваше намерение состоит в том, чтобы просто убрать любой трейлинг |1 с каждой строки, это также довольно расточительно. Еще более расточительно передать результат в отдельный awk процесс, поскольку

  • вы могли бы сделать с sed то, что вы делаете с awk, и в этом случае пропустить то, что вы на самом деле делают с sed (или наоборот ); и
  • все, что вы делаете с обоими из них, может быть легко сделано непосредственно в оболочке, без запуска отдельных процессов.

Более того, все остальное, что вы, похоже, пытаетесь делать с awk также можно сделать в шелл-коде, вместо запуска целых отдельных процессов для таких второстепенных задач.

Учтите это:

while read line; do

  # strip the shortest trailing substring matching the glob |*
  line=${line%|*}

  # split the string based on fixed field widths for all but the last field,
  # using the results as arguments to an execution of some_program.
  # The quoting may be overkill.  It is unnecessary when all lines of the
  # input comply with the specified format.
  some_program "${line:2:2}" "${line:4:2}" "${line:6:2}" "${line:8}"

done < REPROCESO_VTA_20200107.txt
...