В моем входном файле (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"
Используйте команду ниже для чтения n строк из файла:
head -n 1 filename
, чтобы записать ее в переменную, используйте это:
var=$(head -n 1 filename);
Или вы можете прочитать n-ю строку из файла: [ 115]
sed -n '2p' filename
Приведенная выше команда вернет вторую строку файла. В качестве примера вы можете использовать следующее: sed -n $ i'p 'filename где i - индекс.
НО, для вашего кода вам нужен индекс, который будет увеличиваться при каждой итерации.
Поместите перенаправление вывода на весь цикл, а не только на команду sha256sum
. Каждый раз, когда вы перенаправляете, вы заново создаете выходной файл. Это просто создаст его один раз и запишет в него несколько раз в цикле.
while IFS=\n' read -r line || [ -n "$line" ]
do
j=$line
serial=${j}:${epoch}:${StringToken}
echo "$serial"|sha256sum
done < "$StringCsv" > Token.csv
Взятие, Почему использование является циклом оболочки к тексту процесса, который рассматривают плохой практикой? слишком серьезно и использование 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
Вы записываете в файл в цикле с помощью этой команды:
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
очистит существующий файл. См.
Вы записываете в файл в цикле с помощью этой команды:
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
очистит существующий файл. См.