Только одна строка в выводе скрипта

В моем входном файле (SerialNos.csv) несколько строк, например:

4TF16B7GA129E
4TF16B7GA129S
4TF16B7GA129D
4TF16B7GA129X

Я хочу прочитать каждую строку, вычислить контрольную сумму и записать результат в другой файл, но мой Выходной файл Token.csv имеет только одну выходную строку. Как я могу обработать каждую строку?

Мой код:

epoch=$(date -d "`date`" +"%s")
StringCsv="/home/Desktop/TokenGenScript/SerialNos.csv"
StringToken=b5242a2d7973c1aca3723c834ba0d239

while IFS=\n' read -r line || [ -n "$line" ]
do
 j=$line
 serial=${j}:${epoch}:${StringToken}
 echo "$serial"|sha256sum > Token.csv
done < "$StringCsv"
4
задан 28 April 2019 в 08:24

5 ответов

Используйте команду ниже для чтения n строк из файла:

head -n 1 filename

, чтобы записать ее в переменную, используйте это:

var=$(head -n 1 filename);

Или вы можете прочитать n-ю строку из файла: [ 115]

sed -n '2p' filename

Приведенная выше команда вернет вторую строку файла. В качестве примера вы можете использовать следующее: sed -n $ i'p 'filename где i - индекс.

НО, для вашего кода вам нужен индекс, который будет увеличиваться при каждой итерации.

0
ответ дан 28 April 2019 в 08:24

Поместите перенаправление вывода на весь цикл, а не только на команду sha256sum. Каждый раз, когда вы перенаправляете, вы заново создаете выходной файл. Это просто создаст его один раз и запишет в него несколько раз в цикле.

while IFS=\n' read -r line || [ -n "$line" ]
do
 j=$line
 serial=${j}:${epoch}:${StringToken}
 echo "$serial"|sha256sum
done < "$StringCsv" > Token.csv
0
ответ дан 28 April 2019 в 08:24

Взятие, Почему использование является циклом оболочки к тексту процесса, который рассматривают плохой практикой? слишком серьезно и использование getline Awk GNU от Совместно обрабатывания:

gawk -v stringToken=b5242a2d7973c1aca3723c834ba0d239 '
  BEGIN{cmd="sha256sum"; s = systime()} 
  {
    print $0 s stringToken |& cmd; close(cmd,"to"); 
    cmd |& getline; close(cmd,"from")
  } 1
' SerialNos.csv > Token.csv
0
ответ дан 28 April 2019 в 08:24

Вы записываете в файл в цикле с помощью этой команды:

echo "$serial"|sha256sum > Token.csv

Однако каждый раз, когда вы зацикливаетесь, вы стираете файл и записываете новую запись. То, что вы хотите сделать, это добавлять (добавлять) в файл каждый раз, когда вы выполняете цикл с помощью этой команды:

echo "$serial"|sha256sum >> Token.csv

Один > сообщает bash, чтобы стереть файл Token.csv и записать содержимое. Двойной >> говорит bash добавить в конец файла.


Теперь скрипт bash будет выглядеть следующим образом:

#!/bin/bash
epoch=$(date -d "`date`" +"%s")
StringCsv="/home/Desktop/TokenGenScript/SerialNos.csv"
StringToken=b5242a2d7973c1aca3723c834ba0d239

> Token.csv # Empty file from last run

while IFS= 

Существует два способа создания нового пустого файла > Token.csv, как использовано выше, и touch Token.csv. Однако только > Token.csv очистит существующий файл. См.

\n' read -r line || [ -n "$line" ] do j=$line serial=${j}:${epoch}:${StringToken} echo "$serial"|sha256sum >> Token.csv # Append new record to end done < "$StringCsv"

Существует два способа создания нового пустого файла > Token.csv, как использовано выше, и touch Token.csv. Однако только > Token.csv очистит существующий файл. См.

0
ответ дан 28 April 2019 в 08:24

Вы записываете в файл в цикле с помощью этой команды:

echo "$serial"|sha256sum > Token.csv

Однако каждый раз, когда вы зацикливаетесь, вы стираете файл и записываете новую запись. То, что вы хотите сделать, это добавлять (добавлять) в файл каждый раз, когда вы выполняете цикл с помощью этой команды:

echo "$serial"|sha256sum >> Token.csv

Один > сообщает bash, чтобы стереть файл Token.csv и записать содержимое. Двойной >> говорит bash добавить в конец файла.


Теперь скрипт bash будет выглядеть следующим образом:

#!/bin/bash
epoch=$(date -d "`date`" +"%s")
StringCsv="/home/Desktop/TokenGenScript/SerialNos.csv"
StringToken=b5242a2d7973c1aca3723c834ba0d239

> Token.csv # Empty file from last run

while IFS= 

Существует два способа создания нового пустого файла > Token.csv, как использовано выше, и touch Token.csv. Однако только > Token.csv очистит существующий файл. См.

\n' read -r line || [ -n "$line" ] do j=$line serial=${j}:${epoch}:${StringToken} echo "$serial"|sha256sum >> Token.csv # Append new record to end done < "$StringCsv"

Существует два способа создания нового пустого файла > Token.csv, как использовано выше, и touch Token.csv. Однако только > Token.csv очистит существующий файл. См.

0
ответ дан 28 April 2019 в 08:24

Другие вопросы по тегам:

Похожие вопросы: