2016-08-16 3 views
0

Я хочу добавить другое случайное число в конце каждой строки файла. Я должен повторить процесс несколько раз, и каждый файл содержит около 20 тыс. Строк, а каждая строка содержит около 500 тыс. Символов.Добавить случайное число в конце каждой строки файла

Единственное решение, которое я придумал до сих пор

file="example.txt" 
for lineIndex in $(seq 1 "$(wc -l ${file})") 
do 
    lineContent=$(sed "${lineIndex}q;d" ${file}) 
    echo "${lineContent} $RANDOM" >> tmp.txt 
done 
mv tmp.txt ${file} 

Есть ли более быстрый выход?

+0

'кошка $ {файл} | wc -l' - бесполезное использование кошки. Просто 'wc -l $ {file}'. –

+0

Спасибо, такой обзор кода всегда хорош! Сообщение отредактировано. –

+0

Чтение файла по строкам: [Bash FAQ 001] (http://mywiki.wooledge.org/BashFAQ/001) –

ответ

3

Вы можете использовать AWK:

awk '{ print $0, int(32768 * rand()) }' "$file" > tmp && \ 
    mv tmp "$file" 
+0

@ Remi.b: Обязательно используйте 'srand', или случайные числа будут одинаковыми время, кстати – Ryan

3

Вы можете сделать это гораздо проще, и без открытия и закрытия входных и выходных файлов и порождении новых процессов на каждой строке, например:

while read line 
do 
    echo "$line $RANDOM" 
done < "$file" > tmp.txt 
0

Ваш сценарий может быть переписано в виде:

file="example.txt" 
cat ${file} | while read line; do 
    echo "${line} $RANDOM" 
done > tmp.txt 
mv tmp.txt ${file} 
1

Использование AWK:

awk -v seed=$RANDOM 'BEGIN{srand(seed)} {print $0, int(rand() * 10^5+1)}' file 

Если у вас есть Gnu AWK, то вы можете использовать inplace сохранение файла:

awk -i inplace -v seed=$RANDOM 'BEGIN{srand(seed)} {print $0, int(rand() * 10^5+1)}' file 
Смежные вопросы