sed 's/\(\([^,]\+,\)\{3\}\)/\1\n/g;s/,\n/\n/g' filename
Я знаю, что вы просили awk
решение, и теперь я попытаюсь представить его как редактирование этого ответа, но для меня решение sed
было проще...... и пользователь john1024 опередить меня с прекрасным awk
раствором. Смотрите там. Его решение paste
и tr
, вероятно, является наиболее подходящим классическим ответом в стиле Unix -.
В этом решении используются расширенные функции регулярных выражений GNU sed.
\(..\)
— это группа сбора регулярных выражений. Обратите внимание, что решение использует два, один из которых вложен в другой.
[^,]+,
— это любая строка, в которой нет запятой, за которой следует запятая. В вашем случае столбец или поле.
\{3\}
— множитель регулярного выражения, указывающий на использование предшествующего выражения регулярного выражения три раза.
\1
является ссылкой на регулярное выражение -. к предыдущему регулярному выражению.
g
означает сделать это для всех экземпляров в строке.
s/,\n/\n/g
удаляет запятую в конце. Здесь необходимо включить символ новой строки, потому что sed
все еще рассматривает ввод как одну строку.