Самый простой способ заменить столбец в файле? в основном, у моего 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
Но он работает не так, как ожидалось. У меня одна и та же строка снова и снова.
Предполагая, что 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
Предполагая, что 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
Предполагая, что 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
Я бы предложил подход, основанный на 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
Используя 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
Используя 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
Я бы предложил подход, основанный на 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
Используя 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
Я бы предложил подход, основанный на 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