2016-07-12 1 views
0

Мне нужно добавить UUID (только что созданный уникальный для каждой строки) в каждую строку файла. Я бы предпочел использовать SED или AWK для этого действия и использовать исполняемый файл UUIDGEN в своей Linux-коробке. Я не могу понять, как сгенерировать UUID для каждой строки и добавить ее.Как сгенерировать UUID для каждой строки в файле с помощью AWK или SED?

Я пробовал:

awk '{print system(uuidgen) $1} myfile.csv 
sed -i -- 's/^/$(uuidgen)/g' myfile.csv 

И многие другие варианты, которые не работали. Можно ли это сделать с помощью SED или AWK, или я должен исследовать другое решение, которое не основано на сценарии оболочки?

С уважением, Stephen.

ответ

2

Использование xargs будет проще здесь:

paste -d " " myfile.csv <(xargs -I {} uuidgen {} < myfile.csv) 

Это будет вызывать uuidgen для каждой строки myfile.csv

+1

Я предлагаю это, чтобы избежать проблем с пробелами в строках: 'xargs -I {} uuidgen {} Cyrus

+1

Пробелы в myfile.csv создают дополнительные строки. – Cyrus

+0

К сожалению, я не понял, что OP хочет добавить вывод 'uuidgen' – anubhava

2

bash Использование, это создаст файл outfile.txt с каскадным UUID:

ПРИМЕЧАНИЕ. Пожалуйста, запустите which bash, чтобы проверить местонахождение вашей копии bash в вашей системе. Он не может находиться в том же месте, что и в приведенном ниже скрипте.

#!/usr/local/bin/bash 

while IFS= read -r line 
do 
    uuid=$(uuidgen) 
    echo "$line $uuid" >> outfile.txt 
done < myfile.txt 

myfile.txt:

john,doe 
mary,jane 
albert,ellis 
bob,glob 
fig,newton 

outfile.txt

john,doe 46fb31a2-6bc5-4303-9783-85844a4a6583 
mary,jane a14bb565-eea0-47cd-a999-90f84cc8e1e5 
albert,ellis cfab6e8b-00e7-420b-8fe9-f7655801c91c 
bob,glob 63a32fd1-3092-4a72-8c24-7b01c400820c 
fig,newton 63d38ad9-5553-46a4-9f24-2e19035cc40d 
+2

Обратите внимание на [edit-help] (http://stackoverflow.com/editing-help). – Cyrus

+0

Здравствуйте @Cyrus - Я хотел бы выполнить ваше предложение, но я не вижу никаких проблем с редактированием. Пожалуйста, заранее посоветуйте и заблаговременно. – tale852150

+2

Я предлагаю заменить оба изображения по тексту. – Cyrus

1

Попробуйте

awk '{ "uuidgen" |& getline u; print u, $1}' myfile.csv 

, если вы хотите добавить вместо препендом изменить порядок печати ,

+1

Вам не нужен gawk-specific '| &', поскольку это не копроцесс, но вам нужно проверить результат вызова, и вам нужно его закрыть. См. Http://awk.freeshell.org/AllAboutGetline. –

0

Только настройки синтаксиса на вашей попытке, что-то, как это должно работать:

awk '("uuidgen" | getline uuid) > 0 {print uuid, $0} {close("uuidgen")}' myfile.csv 

Например:

$ cat file 
a 
b 
c 

$ awk '("uuidgen" | getline uuid) > 0 {print uuid, $0} {close("uuidgen")}' file 
52a75bc9-e632-4258-bbc6-c944ff51727a a 
24c97c41-d0f4-4cc6-b0c9-81b6d89c5b77 b 
76de9987-a60f-4e3b-ba5e-ae976ab53c7b c 

Правильное решение заключается в использовании других команд, хотя с AWK ISN» t вы ничего не покупаете:

$ xargs -n 1 printf "%s %s\n" $(uuidgen) < file 
763ed28c-453f-47f4-9b1b-b2f972b2cc7d a 
763ed28c-453f-47f4-9b1b-b2f972b2cc7d b 
763ed28c-453f-47f4-9b1b-b2f972b2cc7d c 
0

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

paste <(sed 's/.*/uuidgen/e' file) file

Это использует GNU выполнить расширение e для генерации UUID в каждой строке, а затем paste пасты текст вместе. Используйте флаг -dpaste, чтобы изменить разделитель со вкладки по умолчанию, независимо от того, что вы хотите.

Смежные вопросы