Замена нескольких символов с помощью awk на запятую для csv - PullRequest
2 голосов
/ 02 октября 2019

Уважаемые,

У меня есть следующий список, который когда-нибудь содержит 10000 записей:

listID.14.1 = STRING: test1
listID.14.2 = STRING: test2
listID.14.3 = STRING: test3
listID.14.4 = STRING: test4
listID.14.5 = STRING: test5 
listID.14.6 = STRING: test6
listID.14.7 = STRING: test7 

Я хочу, чтобы вывод был таким

test1,test2,test3,...,test7

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

awk -F "listID.${listID}.([0-9]+|[0-9]{3}|[0-9]{1,5}) = STRING: " '{print ","$2}'

, но результат оказался таким:

,test1
,test2
,test3
,test4

, что неправильно, не так"test1, test2, test3, ...., testn", как я хочу, я не уверен, как изменить свой код, чтобы результат, как я показал выше, некоторая идея, я думаю о добавлении новой строки в начале, но кодэто не сработало для меня, я думаю, что использовал неправильный формат. Нужна помощь

awk -F "\nlistID.${listID}.([0-9]+|[0-9]{3}|[0-9]{1,5}) = STRING: " '{print ","$2}'

Нужна помощь Также второй вопрос по этому коду:

awk -F "listID.${listID}.([0-9]+|[0-9]{3}|[0-9]{1,5}) = STRING: " '{print ","$2}'

делает этот конкретный формат ([0-9] + | [0-9] {3} | [0-9] {1,5}) проверка номера от 1 до 10000

Ответы [ 4 ]

4 голосов
/ 02 октября 2019

Извлечь текст после последнего пробела и распечатать его через запятую:

 cut -d' ' -f4 | paste -sd,

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

cat <<EOF |
listID.14.1 = STRING: test1
listID.14.2 = STRING: test2
listID.14.3 = STRING: test3
listID.14.4 = STRING: test4
listID.14.5 = STRING: test5 
listID.14.6 = STRING: test6
listID.14.7 = STRING: test7 
EOF
cut -d' ' -f4 | paste -sd,

Вывод:

test1,test2,test3,test4,test5,test6,test7
3 голосов
/ 02 октября 2019

Это должно сделать:

awk '{printf "%s,",$NF} END {print ""}' file
test1,test2,test3,test4,test5,test6,test7,

Если вам не нравится дополнительная запятая в конце:

awk '{printf (NR==1?"":",")"%s",$NF} END {print ""}' file
test1,test2,test3,test4,test5,test6,test7
2 голосов
/ 02 октября 2019

Вы можете сделать что-то вроде этого

awk '{ a = a","$4 } END {print a }' < foo

Если foo - это файл, содержащий ваши данные, в нем останется запятая

,test1,test2,test3,test4,test5,test6,test7

Вы можете удалить его с помощью sed | sed 's/^,//'.

0 голосов
/ 02 октября 2019

Если Perl - ваш вариант, попробуйте:

perl -lane 'push(@ary, pop(@F)); END {print join(",", @ary)};' list.txt
  • -l - опция автоматически удаляет разделитель записей входных строк и добавляет его обратно в выходные строки.
  • -a включает режим автоматического разделения на пустые символы, как AWK и присваивает поля массиву @F.
  • pop(@F) возвращает последний добавляемый элемент @F для добавленияна @ary.
  • -n опция заставляет perl перебирать входные записи, как AWK делает.

Кстати, отвечая на ваш 2-й вопрос, регулярное выражение /^([1-9][0-9]{0,3}|10000)$/ будетсопоставьте числа от 1 до 10000.

Таким образом, ваша последняя строка будет выглядеть примерно так:

awk -F "listID\.${listID}\.([1-9][0-9]{0,3}|10000) = STRING: " '{printf ",%s", $2}'

, хотя установка FS для сложной строки, как указано выше, может не быть хорошей идеей. Он не будет работать так, как вы ожидаете, потому что он не пропускает строки, которые не соответствуют регулярному выражению.

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...