заменить весь столбец в файле случайной строкой

Самый простой способ заменить столбец в файле? в основном, у моего file.txt есть 3 столбца, разделенных ,.

Как изменить второй столбец с помощью сценария bash?

SveUJW24ibppfePgYeYHz7fC0,64BzZdqrYY7Tx8sbj5tmEW,yL6mCP0Do28k4EoTZUfKfqNYiIhGxxkA xyRG8Da6kY35xeIT492Lul7xu,gTdmvjmahIOoyzmrttVMvTc1ER0bt,ne6RIM2TeMQAax1GgzL7FeDrnQyHPH1i sxTf13KlAnjtXodJouQ9V6m5b,LzLtoEg18E1brm66dPjcHZfpI107nn4h,GUnApYwwDCZxWGZtzKzTU6sJRgHlUUfQ 7cjW5DZlXw1LYzVugbVyqfxRX,i7B4Q9w8h5anmMW87DfIBEm0AuNjbLGq,XttE1In9eZQ8puJVUriuNvx2AJAxviGf XiLE8r9AMqy5YZQ9BbIS6m559,ToT2wbQdpNNySPxP1Tgz1,DssiszVBa05pbVDSOXNRaFXRxw0eZKHf Sygrl5287BViOn0uQ9uCYipB1,TEYnXl6APWGbm9ckLCcHFUJzk7qS8JXH,sD2O46sbh1yVIluoyn6Zm2OKXYe05vV9 Qi6DxJ96M0hxNe4cgux3iJ1aS,LK3GHTpuo9kbmK9McRN4sFRQTGh2DU8J,wk2eF3f9xk5HowLzDIL3hCCNSmx8Uwi8 ZIX7qp5IIPekA0kzBdFR4IUQZ,9m9lEjfiotQ97s3uVN8EEP7Y1JmpgAk7,99ilfJWoJEBsKOfYI3buFfher07OCz6Y

Обновить заменить другой строкой в Переменная. скажем, var=new-sting.

На самом деле я думал, что могу сделать что-то вроде этого:

sed "s/,[^,]*/,$(cat /dev/urandom | tr -dc 'a-zA-Z0-9' | fold -w 32 | head -n 1)/" file.txt

Но он работает не так, как ожидалось. У меня одна и та же строка снова и снова.

7
задан 19 May 2017 в 14:46

9 ответов

Предполагая, что file.txt содержит строки текста, которые разделены на три столбца запятыми и что никаких дополнительных запятых нет в любом месте, поэтому каждая строка имеет ровно два из них:

replacement="my string"
sed "s/,.*,/,$replacement,/" file.txt

Выход:

SveUJW24ibppfePgYeYHz7fC0,my string,yL6mCP0Do28k4EoTZUfKfqNYiIhGxxkA
xyRG8Da6kY35xeIT492Lul7xu,my string,ne6RIM2TeMQAax1GgzL7FeDrnQyHPH1i
sxTf13KlAnjtXodJouQ9V6m5b,my string,GUnApYwwDCZxWGZtzKzTU6sJRgHlUUfQ
7cjW5DZlXw1LYzVugbVyqfxRX,my string,XttE1In9eZQ8puJVUriuNvx2AJAxviGf
XiLE8r9AMqy5YZQ9BbIS6m559,my string,DssiszVBa05pbVDSOXNRaFXRxw0eZKHf
Sygrl5287BViOn0uQ9uCYipB1,my string,sD2O46sbh1yVIluoyn6Zm2OKXYe05vV9
Qi6DxJ96M0hxNe4cgux3iJ1aS,my string,wk2eF3f9xk5HowLzDIL3hCCNSmx8Uwi8
ZIX7qp5IIPekA0kzBdFR4IUQZ,my string,99ilfJWoJEBsKOfYI3buFfher07OCz6Y

Это будет обрабатывать все строки одновременно и каждый раз заменять средний столбец одинаковым значением. Измененный контент будет напечатан на терминале по умолчанию, если вы хотите вместо этого изменить file.txt вместо записи sed -i вместо обычного sed.

Если вам нужно обновить заменяющую переменную для каждой строки (здесь новая случайная строка для каждой строки), вы можете перебирать строки следующим образом:

while read line ; do
    replacement="random number $RANDOM"
    sed "s/,.*,/,$replacement,/" <<< "$line"
done < file.txt

Пример вывода:

SveUJW24ibppfePgYeYHz7fC0,random number 27584,yL6mCP0Do28k4EoTZUfKfqNYiIhGxxkA
xyRG8Da6kY35xeIT492Lul7xu,random number 2959,ne6RIM2TeMQAax1GgzL7FeDrnQyHPH1i
sxTf13KlAnjtXodJouQ9V6m5b,random number 5463,GUnApYwwDCZxWGZtzKzTU6sJRgHlUUfQ
7cjW5DZlXw1LYzVugbVyqfxRX,random number 12889,XttE1In9eZQ8puJVUriuNvx2AJAxviGf
XiLE8r9AMqy5YZQ9BbIS6m559,random number 3754,DssiszVBa05pbVDSOXNRaFXRxw0eZKHf
Sygrl5287BViOn0uQ9uCYipB1,random number 25375,sD2O46sbh1yVIluoyn6Zm2OKXYe05vV9
Qi6DxJ96M0hxNe4cgux3iJ1aS,random number 5284,wk2eF3f9xk5HowLzDIL3hCCNSmx8Uwi8

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

bash my-replacement-script.sh > new-file.txt
6
ответ дан 22 May 2018 в 22:28

Предполагая, что file.txt содержит строки текста, которые разделены на три столбца запятыми и что никаких дополнительных запятых нет в любом месте, поэтому каждая строка имеет ровно два из них:

replacement="my string" sed "s/,.*,/,$replacement,/" file.txt

Выход:

SveUJW24ibppfePgYeYHz7fC0,my string,yL6mCP0Do28k4EoTZUfKfqNYiIhGxxkA xyRG8Da6kY35xeIT492Lul7xu,my string,ne6RIM2TeMQAax1GgzL7FeDrnQyHPH1i sxTf13KlAnjtXodJouQ9V6m5b,my string,GUnApYwwDCZxWGZtzKzTU6sJRgHlUUfQ 7cjW5DZlXw1LYzVugbVyqfxRX,my string,XttE1In9eZQ8puJVUriuNvx2AJAxviGf XiLE8r9AMqy5YZQ9BbIS6m559,my string,DssiszVBa05pbVDSOXNRaFXRxw0eZKHf Sygrl5287BViOn0uQ9uCYipB1,my string,sD2O46sbh1yVIluoyn6Zm2OKXYe05vV9 Qi6DxJ96M0hxNe4cgux3iJ1aS,my string,wk2eF3f9xk5HowLzDIL3hCCNSmx8Uwi8 ZIX7qp5IIPekA0kzBdFR4IUQZ,my string,99ilfJWoJEBsKOfYI3buFfher07OCz6Y

Это будет обрабатывать все строки одновременно и каждый раз заменять средний столбец одинаковым значением. Измененный контент будет напечатан на терминале по умолчанию, если вы хотите вместо этого изменить file.txt вместо записи sed -i вместо обычного sed.

Если вам нужно обновить заменяющую переменную для каждой строки (здесь новая случайная строка для каждой строки), вы можете перебирать строки следующим образом:

while read line ; do replacement="random number $RANDOM" sed "s/,.*,/,$replacement,/" <<< "$line" done < file.txt

Пример вывода:

SveUJW24ibppfePgYeYHz7fC0,random number 27584,yL6mCP0Do28k4EoTZUfKfqNYiIhGxxkA xyRG8Da6kY35xeIT492Lul7xu,random number 2959,ne6RIM2TeMQAax1GgzL7FeDrnQyHPH1i sxTf13KlAnjtXodJouQ9V6m5b,random number 5463,GUnApYwwDCZxWGZtzKzTU6sJRgHlUUfQ 7cjW5DZlXw1LYzVugbVyqfxRX,random number 12889,XttE1In9eZQ8puJVUriuNvx2AJAxviGf XiLE8r9AMqy5YZQ9BbIS6m559,random number 3754,DssiszVBa05pbVDSOXNRaFXRxw0eZKHf Sygrl5287BViOn0uQ9uCYipB1,random number 25375,sD2O46sbh1yVIluoyn6Zm2OKXYe05vV9 Qi6DxJ96M0hxNe4cgux3iJ1aS,random number 5284,wk2eF3f9xk5HowLzDIL3hCCNSmx8Uwi8

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

bash my-replacement-script.sh > new-file.txt
6
ответ дан 18 July 2018 в 13:04

Предполагая, что file.txt содержит строки текста, которые разделены на три столбца запятыми и что никаких дополнительных запятых нет в любом месте, поэтому каждая строка имеет ровно два из них:

replacement="my string" sed "s/,.*,/,$replacement,/" file.txt

Выход:

SveUJW24ibppfePgYeYHz7fC0,my string,yL6mCP0Do28k4EoTZUfKfqNYiIhGxxkA xyRG8Da6kY35xeIT492Lul7xu,my string,ne6RIM2TeMQAax1GgzL7FeDrnQyHPH1i sxTf13KlAnjtXodJouQ9V6m5b,my string,GUnApYwwDCZxWGZtzKzTU6sJRgHlUUfQ 7cjW5DZlXw1LYzVugbVyqfxRX,my string,XttE1In9eZQ8puJVUriuNvx2AJAxviGf XiLE8r9AMqy5YZQ9BbIS6m559,my string,DssiszVBa05pbVDSOXNRaFXRxw0eZKHf Sygrl5287BViOn0uQ9uCYipB1,my string,sD2O46sbh1yVIluoyn6Zm2OKXYe05vV9 Qi6DxJ96M0hxNe4cgux3iJ1aS,my string,wk2eF3f9xk5HowLzDIL3hCCNSmx8Uwi8 ZIX7qp5IIPekA0kzBdFR4IUQZ,my string,99ilfJWoJEBsKOfYI3buFfher07OCz6Y

Это будет обрабатывать все строки одновременно и каждый раз заменять средний столбец одинаковым значением. Измененный контент будет напечатан на терминале по умолчанию, если вы хотите вместо этого изменить file.txt вместо записи sed -i вместо обычного sed.

Если вам нужно обновить заменяющую переменную для каждой строки (здесь новая случайная строка для каждой строки), вы можете перебирать строки следующим образом:

while read line ; do replacement="random number $RANDOM" sed "s/,.*,/,$replacement,/" <<< "$line" done < file.txt

Пример вывода:

SveUJW24ibppfePgYeYHz7fC0,random number 27584,yL6mCP0Do28k4EoTZUfKfqNYiIhGxxkA xyRG8Da6kY35xeIT492Lul7xu,random number 2959,ne6RIM2TeMQAax1GgzL7FeDrnQyHPH1i sxTf13KlAnjtXodJouQ9V6m5b,random number 5463,GUnApYwwDCZxWGZtzKzTU6sJRgHlUUfQ 7cjW5DZlXw1LYzVugbVyqfxRX,random number 12889,XttE1In9eZQ8puJVUriuNvx2AJAxviGf XiLE8r9AMqy5YZQ9BbIS6m559,random number 3754,DssiszVBa05pbVDSOXNRaFXRxw0eZKHf Sygrl5287BViOn0uQ9uCYipB1,random number 25375,sD2O46sbh1yVIluoyn6Zm2OKXYe05vV9 Qi6DxJ96M0hxNe4cgux3iJ1aS,random number 5284,wk2eF3f9xk5HowLzDIL3hCCNSmx8Uwi8

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

bash my-replacement-script.sh > new-file.txt
6
ответ дан 24 July 2018 в 20:05

Я бы предложил подход, основанный на perl Bytes :: Random :: Secure модуле, на основе заполнения столбца текстового файла случайными данными с использованием bash, измененного для использования желаемого сочетания букв верхнего и нижнего регистра и десятичных цифр :

perl -MBytes::Random::Secure=random_string_from -F, -ane '
  BEGIN{$chars = join "", ("a".."z","A".."Z",0..9)}
  $F[1] = random_string_from($chars, 32);
  print join ",", @F
' file

В качестве альтернативы, если вы хотите использовать конвейер /dev/urandom, один из способов сделать это без внешнего цикла будет использовать FIFO с функцией awk getline :

заставляют FIFO $ mkfifo _fifo выполнять вашу команду, передавая ее вывод в FIFO
$ cat /dev/urandom | tr -dc 'a-zA-Z0-9' | fold -w 32 > _fifo &
или (исключая бесполезное использование cat)
$ tr -dc 'a-zA-Z0-9' < /dev/urandom | fold -w 32 > _fifo &
получать строки из FIFO и подставлять их в строки целевого файла
$ awk '{getline $2 < "_fifo"} 1' FS=, OFS=, file
удаляют FIFO
rm _fifo

Тестирование:

$ mkfifo _fifo
$ tr -dc 'a-zA-Z0-9' < /dev/urandom | fold -w 32 > _fifo &
[1] 5815
$ awk '{getline $2 < "_fifo"} 1' FS=, OFS=, file
SveUJW24ibppfePgYeYHz7fC0,hpqBxCOYIj7eQ9MgbPNG69SY3X3iAJ7A,yL6mCP0Do28k4EoTZUfKfqNYiIhGxxkA
xyRG8Da6kY35xeIT492Lul7xu,ACU1hyR8zGRfDMeUk4a6TFVcQvUAtZog,ne6RIM2TeMQAax1GgzL7FeDrnQyHPH1i
sxTf13KlAnjtXodJouQ9V6m5b,dkeKUnMYZepGcGMgdQc9IORa77Vtwr7w,GUnApYwwDCZxWGZtzKzTU6sJRgHlUUfQ
7cjW5DZlXw1LYzVugbVyqfxRX,UMjkPZAB3ElpOnXWnsQe9w1v0h6HMLPs,XttE1In9eZQ8puJVUriuNvx2AJAxviGf
XiLE8r9AMqy5YZQ9BbIS6m559,iz5tavnYqajwTokPCM4HJIsZlIloLcVy,DssiszVBa05pbVDSOXNRaFXRxw0eZKHf
Sygrl5287BViOn0uQ9uCYipB1,RHPFMgKoIGojvM6aTwb43lH4BAr8Jh5Y,sD2O46sbh1yVIluoyn6Zm2OKXYe05vV9
Qi6DxJ96M0hxNe4cgux3iJ1aS,fqTsEPr3PIPqIWPrb2uIl47QjXlSt3gL,wk2eF3f9xk5HowLzDIL3hCCNSmx8Uwi8
ZIX7qp5IIPekA0kzBdFR4IUQZ,uAFKvX5z2ik2i1AKh3wYp503xpNy8dxA,99ilfJWoJEBsKOfYI3buFfher07OCz6Y
rm _fifo
[1]+  Broken pipe             cat /dev/urandom | tr -dc 'a-zA-Z0-9' | fold -w 32 > _fifo

С помощью GNU awk вы можете сделать эквивалент внутри, используя getline с co -process:

$ gawk '{"tr -dc 'a-zA-Z0-9' < /dev/urandom | fold -w 32" |& getline $2} 1' FS=, OFS=, file 
SveUJW24ibppfePgYeYHz7fC0,hKOYDf6lgEtVwzJvCl34eYu22m5bZ11e,yL6mCP0Do28k4EoTZUfKfqNYiIhGxxkA
xyRG8Da6kY35xeIT492Lul7xu,bV9m4OgbTzDTJQanhS3BTmxr5gUcouDy,ne6RIM2TeMQAax1GgzL7FeDrnQyHPH1i
sxTf13KlAnjtXodJouQ9V6m5b,r9850TtXPJsLLNMupiwSPsqx7ovtb5ph,GUnApYwwDCZxWGZtzKzTU6sJRgHlUUfQ
7cjW5DZlXw1LYzVugbVyqfxRX,aRRVAecWxeTtt3WX36MIoFlMCvDcFb3a,XttE1In9eZQ8puJVUriuNvx2AJAxviGf
XiLE8r9AMqy5YZQ9BbIS6m559,BeCoCV4kMb8FUt6Y3RFxolI2CKqzbeuO,DssiszVBa05pbVDSOXNRaFXRxw0eZKHf
Sygrl5287BViOn0uQ9uCYipB1,WZ0hSxurp22dCdhV12Gjcms6rdx8hjM2,sD2O46sbh1yVIluoyn6Zm2OKXYe05vV9
Qi6DxJ96M0hxNe4cgux3iJ1aS,ujxdLQZo1vkCZnkUej6pLjZxVmN7XiTE,wk2eF3f9xk5HowLzDIL3hCCNSmx8Uwi8
ZIX7qp5IIPekA0kzBdFR4IUQZ,qxp3dwltN5Mxfece27Zvq2NqbjPlF358,99ilfJWoJEBsKOfYI3buFfher07OCz6Y
6
ответ дан 22 May 2018 в 22:28

Используя awk:

awk -v var="mystring" -F, 'BEGIN {OFS = FS} {$2 = var; print}'
-v: создайте переменную с именем var, которая содержит строку «mystring» -F,: используйте , в качестве разделителя полей BEGIN {OFS = FS} установите разделитель выходного поля, равный разделителю полей, чтобы сохранить разделитель (запятую) после замены {$2 = var; print} заменить поле 2 (столбец 2) содержимым var; затем распечатайте.

Вы также можете изменить -v var="mystring" на что-то вроде -v var="$variable", которое $variable является переменной в вашей среде.

Вот пример:

veUJW24ibppfePgYeYHz7fC0,64BzZdqrYY7Tx8sbj5tmEW,yL6mCP0Do28k4EoTZUfKfqNYiIhGxxkA
xyRG8Da6kY35xeIT492Lul7xu,gTdmvjmahIOoyzmrttVMvTc1ER0bt,ne6RIM2TeMQAax1GgzL7FeDrnQyHPH1i
sxTf13KlAnjtXodJouQ9V6m5b,LzLtoEg18E1brm66dPjcHZfpI107nn4h,GUnApYwwDCZxWGZtzKzTU6sJRgHlUUfQ

запустим команду:

$ awk -v var="HERE-IS-MY-STRING" -F, 'BEGIN {OFS = FS} {$2 = var; print}' file.tx

veUJW24ibppfePgYeYHz7fC0,HERE-IS-MY-STRING,yL6mCP0Do28k4EoTZUfKfqNYiIhGxxkA
xyRG8Da6kY35xeIT492Lul7xu,HERE-IS-MY-STRING,ne6RIM2TeMQAax1GgzL7FeDrnQyHPH1i
sxTf13KlAnjtXodJouQ9V6m5b,HERE-IS-MY-STRING,GUnApYwwDCZxWGZtzKzTU6sJRgHlUUfQ
3
ответ дан 22 May 2018 в 22:28

Используя awk:

awk -v var="mystring" -F, 'BEGIN {OFS = FS} {$2 = var; print}' -v: создайте переменную с именем var, которая содержит строку «mystring» -F,: используйте , в качестве разделителя полей BEGIN {OFS = FS} установите разделитель выходного поля, равный разделителю полей, чтобы сохранить разделитель (запятую) после замены {$2 = var; print} заменить поле 2 (столбец 2) содержимым var; затем распечатайте.

Вы также можете изменить -v var="mystring" на что-то вроде -v var="$variable", которое $variable является переменной в вашей среде.

Вот пример:

veUJW24ibppfePgYeYHz7fC0,64BzZdqrYY7Tx8sbj5tmEW,yL6mCP0Do28k4EoTZUfKfqNYiIhGxxkA xyRG8Da6kY35xeIT492Lul7xu,gTdmvjmahIOoyzmrttVMvTc1ER0bt,ne6RIM2TeMQAax1GgzL7FeDrnQyHPH1i sxTf13KlAnjtXodJouQ9V6m5b,LzLtoEg18E1brm66dPjcHZfpI107nn4h,GUnApYwwDCZxWGZtzKzTU6sJRgHlUUfQ

запустим команду:

$ awk -v var="HERE-IS-MY-STRING" -F, 'BEGIN {OFS = FS} {$2 = var; print}' file.tx veUJW24ibppfePgYeYHz7fC0,HERE-IS-MY-STRING,yL6mCP0Do28k4EoTZUfKfqNYiIhGxxkA xyRG8Da6kY35xeIT492Lul7xu,HERE-IS-MY-STRING,ne6RIM2TeMQAax1GgzL7FeDrnQyHPH1i sxTf13KlAnjtXodJouQ9V6m5b,HERE-IS-MY-STRING,GUnApYwwDCZxWGZtzKzTU6sJRgHlUUfQ
3
ответ дан 18 July 2018 в 13:04

Я бы предложил подход, основанный на perl Bytes :: Random :: Secure модуле, на основе заполнения столбца текстового файла случайными данными с использованием bash, измененного для использования желаемого сочетания букв верхнего и нижнего регистра и десятичных цифр :

perl -MBytes::Random::Secure=random_string_from -F, -ane ' BEGIN{$chars = join "", ("a".."z","A".."Z",0..9)} $F[1] = random_string_from($chars, 32); print join ",", @F ' file

В качестве альтернативы, если вы хотите использовать конвейер /dev/urandom, один из способов сделать это без внешнего цикла будет использовать FIFO с функцией awk getline :

заставляют FIFO $ mkfifo _fifo выполнять вашу команду, передавая ее вывод в FIFO $ cat /dev/urandom | tr -dc 'a-zA-Z0-9' | fold -w 32 > _fifo & или (исключая бесполезное использование cat) $ tr -dc 'a-zA-Z0-9' < /dev/urandom | fold -w 32 > _fifo & получать строки из FIFO и подставлять их в строки целевого файла $ awk '{getline $2 < "_fifo"} 1' FS=, OFS=, file удаляют FIFO rm _fifo

Тестирование:

$ mkfifo _fifo $ tr -dc 'a-zA-Z0-9' < /dev/urandom | fold -w 32 > _fifo & [1] 5815 $ awk '{getline $2 < "_fifo"} 1' FS=, OFS=, file SveUJW24ibppfePgYeYHz7fC0,hpqBxCOYIj7eQ9MgbPNG69SY3X3iAJ7A,yL6mCP0Do28k4EoTZUfKfqNYiIhGxxkA xyRG8Da6kY35xeIT492Lul7xu,ACU1hyR8zGRfDMeUk4a6TFVcQvUAtZog,ne6RIM2TeMQAax1GgzL7FeDrnQyHPH1i sxTf13KlAnjtXodJouQ9V6m5b,dkeKUnMYZepGcGMgdQc9IORa77Vtwr7w,GUnApYwwDCZxWGZtzKzTU6sJRgHlUUfQ 7cjW5DZlXw1LYzVugbVyqfxRX,UMjkPZAB3ElpOnXWnsQe9w1v0h6HMLPs,XttE1In9eZQ8puJVUriuNvx2AJAxviGf XiLE8r9AMqy5YZQ9BbIS6m559,iz5tavnYqajwTokPCM4HJIsZlIloLcVy,DssiszVBa05pbVDSOXNRaFXRxw0eZKHf Sygrl5287BViOn0uQ9uCYipB1,RHPFMgKoIGojvM6aTwb43lH4BAr8Jh5Y,sD2O46sbh1yVIluoyn6Zm2OKXYe05vV9 Qi6DxJ96M0hxNe4cgux3iJ1aS,fqTsEPr3PIPqIWPrb2uIl47QjXlSt3gL,wk2eF3f9xk5HowLzDIL3hCCNSmx8Uwi8 ZIX7qp5IIPekA0kzBdFR4IUQZ,uAFKvX5z2ik2i1AKh3wYp503xpNy8dxA,99ilfJWoJEBsKOfYI3buFfher07OCz6Y rm _fifo [1]+ Broken pipe cat /dev/urandom | tr -dc 'a-zA-Z0-9' | fold -w 32 > _fifo

С помощью GNU awk вы можете сделать эквивалент внутри, используя getline с co -process:

$ gawk '{"tr -dc 'a-zA-Z0-9' < /dev/urandom | fold -w 32" |& getline $2} 1' FS=, OFS=, file SveUJW24ibppfePgYeYHz7fC0,hKOYDf6lgEtVwzJvCl34eYu22m5bZ11e,yL6mCP0Do28k4EoTZUfKfqNYiIhGxxkA xyRG8Da6kY35xeIT492Lul7xu,bV9m4OgbTzDTJQanhS3BTmxr5gUcouDy,ne6RIM2TeMQAax1GgzL7FeDrnQyHPH1i sxTf13KlAnjtXodJouQ9V6m5b,r9850TtXPJsLLNMupiwSPsqx7ovtb5ph,GUnApYwwDCZxWGZtzKzTU6sJRgHlUUfQ 7cjW5DZlXw1LYzVugbVyqfxRX,aRRVAecWxeTtt3WX36MIoFlMCvDcFb3a,XttE1In9eZQ8puJVUriuNvx2AJAxviGf XiLE8r9AMqy5YZQ9BbIS6m559,BeCoCV4kMb8FUt6Y3RFxolI2CKqzbeuO,DssiszVBa05pbVDSOXNRaFXRxw0eZKHf Sygrl5287BViOn0uQ9uCYipB1,WZ0hSxurp22dCdhV12Gjcms6rdx8hjM2,sD2O46sbh1yVIluoyn6Zm2OKXYe05vV9 Qi6DxJ96M0hxNe4cgux3iJ1aS,ujxdLQZo1vkCZnkUej6pLjZxVmN7XiTE,wk2eF3f9xk5HowLzDIL3hCCNSmx8Uwi8 ZIX7qp5IIPekA0kzBdFR4IUQZ,qxp3dwltN5Mxfece27Zvq2NqbjPlF358,99ilfJWoJEBsKOfYI3buFfher07OCz6Y
6
ответ дан 18 July 2018 в 13:04

Используя awk:

awk -v var="mystring" -F, 'BEGIN {OFS = FS} {$2 = var; print}' -v: создайте переменную с именем var, которая содержит строку «mystring» -F,: используйте , в качестве разделителя полей BEGIN {OFS = FS} установите разделитель выходного поля, равный разделителю полей, чтобы сохранить разделитель (запятую) после замены {$2 = var; print} заменить поле 2 (столбец 2) содержимым var; затем распечатайте.

Вы также можете изменить -v var="mystring" на что-то вроде -v var="$variable", которое $variable является переменной в вашей среде.

Вот пример:

veUJW24ibppfePgYeYHz7fC0,64BzZdqrYY7Tx8sbj5tmEW,yL6mCP0Do28k4EoTZUfKfqNYiIhGxxkA xyRG8Da6kY35xeIT492Lul7xu,gTdmvjmahIOoyzmrttVMvTc1ER0bt,ne6RIM2TeMQAax1GgzL7FeDrnQyHPH1i sxTf13KlAnjtXodJouQ9V6m5b,LzLtoEg18E1brm66dPjcHZfpI107nn4h,GUnApYwwDCZxWGZtzKzTU6sJRgHlUUfQ

запустим команду:

$ awk -v var="HERE-IS-MY-STRING" -F, 'BEGIN {OFS = FS} {$2 = var; print}' file.tx veUJW24ibppfePgYeYHz7fC0,HERE-IS-MY-STRING,yL6mCP0Do28k4EoTZUfKfqNYiIhGxxkA xyRG8Da6kY35xeIT492Lul7xu,HERE-IS-MY-STRING,ne6RIM2TeMQAax1GgzL7FeDrnQyHPH1i sxTf13KlAnjtXodJouQ9V6m5b,HERE-IS-MY-STRING,GUnApYwwDCZxWGZtzKzTU6sJRgHlUUfQ
3
ответ дан 24 July 2018 в 20:05

Я бы предложил подход, основанный на perl Bytes :: Random :: Secure модуле, на основе заполнения столбца текстового файла случайными данными с использованием bash, измененного для использования желаемого сочетания букв верхнего и нижнего регистра и десятичных цифр :

perl -MBytes::Random::Secure=random_string_from -F, -ane ' BEGIN{$chars = join "", ("a".."z","A".."Z",0..9)} $F[1] = random_string_from($chars, 32); print join ",", @F ' file

В качестве альтернативы, если вы хотите использовать конвейер /dev/urandom, один из способов сделать это без внешнего цикла будет использовать FIFO с функцией awk getline :

заставляют FIFO $ mkfifo _fifo выполнять вашу команду, передавая ее вывод в FIFO $ cat /dev/urandom | tr -dc 'a-zA-Z0-9' | fold -w 32 > _fifo & или (исключая бесполезное использование cat) $ tr -dc 'a-zA-Z0-9' < /dev/urandom | fold -w 32 > _fifo & получать строки из FIFO и подставлять их в строки целевого файла $ awk '{getline $2 < "_fifo"} 1' FS=, OFS=, file удаляют FIFO rm _fifo

Тестирование:

$ mkfifo _fifo $ tr -dc 'a-zA-Z0-9' < /dev/urandom | fold -w 32 > _fifo & [1] 5815 $ awk '{getline $2 < "_fifo"} 1' FS=, OFS=, file SveUJW24ibppfePgYeYHz7fC0,hpqBxCOYIj7eQ9MgbPNG69SY3X3iAJ7A,yL6mCP0Do28k4EoTZUfKfqNYiIhGxxkA xyRG8Da6kY35xeIT492Lul7xu,ACU1hyR8zGRfDMeUk4a6TFVcQvUAtZog,ne6RIM2TeMQAax1GgzL7FeDrnQyHPH1i sxTf13KlAnjtXodJouQ9V6m5b,dkeKUnMYZepGcGMgdQc9IORa77Vtwr7w,GUnApYwwDCZxWGZtzKzTU6sJRgHlUUfQ 7cjW5DZlXw1LYzVugbVyqfxRX,UMjkPZAB3ElpOnXWnsQe9w1v0h6HMLPs,XttE1In9eZQ8puJVUriuNvx2AJAxviGf XiLE8r9AMqy5YZQ9BbIS6m559,iz5tavnYqajwTokPCM4HJIsZlIloLcVy,DssiszVBa05pbVDSOXNRaFXRxw0eZKHf Sygrl5287BViOn0uQ9uCYipB1,RHPFMgKoIGojvM6aTwb43lH4BAr8Jh5Y,sD2O46sbh1yVIluoyn6Zm2OKXYe05vV9 Qi6DxJ96M0hxNe4cgux3iJ1aS,fqTsEPr3PIPqIWPrb2uIl47QjXlSt3gL,wk2eF3f9xk5HowLzDIL3hCCNSmx8Uwi8 ZIX7qp5IIPekA0kzBdFR4IUQZ,uAFKvX5z2ik2i1AKh3wYp503xpNy8dxA,99ilfJWoJEBsKOfYI3buFfher07OCz6Y rm _fifo [1]+ Broken pipe cat /dev/urandom | tr -dc 'a-zA-Z0-9' | fold -w 32 > _fifo

С помощью GNU awk вы можете сделать эквивалент внутри, используя getline с co -process:

$ gawk '{"tr -dc 'a-zA-Z0-9' < /dev/urandom | fold -w 32" |& getline $2} 1' FS=, OFS=, file SveUJW24ibppfePgYeYHz7fC0,hKOYDf6lgEtVwzJvCl34eYu22m5bZ11e,yL6mCP0Do28k4EoTZUfKfqNYiIhGxxkA xyRG8Da6kY35xeIT492Lul7xu,bV9m4OgbTzDTJQanhS3BTmxr5gUcouDy,ne6RIM2TeMQAax1GgzL7FeDrnQyHPH1i sxTf13KlAnjtXodJouQ9V6m5b,r9850TtXPJsLLNMupiwSPsqx7ovtb5ph,GUnApYwwDCZxWGZtzKzTU6sJRgHlUUfQ 7cjW5DZlXw1LYzVugbVyqfxRX,aRRVAecWxeTtt3WX36MIoFlMCvDcFb3a,XttE1In9eZQ8puJVUriuNvx2AJAxviGf XiLE8r9AMqy5YZQ9BbIS6m559,BeCoCV4kMb8FUt6Y3RFxolI2CKqzbeuO,DssiszVBa05pbVDSOXNRaFXRxw0eZKHf Sygrl5287BViOn0uQ9uCYipB1,WZ0hSxurp22dCdhV12Gjcms6rdx8hjM2,sD2O46sbh1yVIluoyn6Zm2OKXYe05vV9 Qi6DxJ96M0hxNe4cgux3iJ1aS,ujxdLQZo1vkCZnkUej6pLjZxVmN7XiTE,wk2eF3f9xk5HowLzDIL3hCCNSmx8Uwi8 ZIX7qp5IIPekA0kzBdFR4IUQZ,qxp3dwltN5Mxfece27Zvq2NqbjPlF358,99ilfJWoJEBsKOfYI3buFfher07OCz6Y
6
ответ дан 24 July 2018 в 20:05

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

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