Пустая строка после каждой записи и столбцы в новой строке - PullRequest
2 голосов
/ 28 января 2020

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

text11|text12|text13 text121|text122|text123 text131|text132|text133
text21|text22|text23 text221|text222|text223 text231|text232|text233 text241|text242|text243

То, что я хочу, это:

  1. каждый столбец должен быть на новой строке
  2. труба должна быть заменена пробелом
  3. , и после каждой записи исходного файла должна быть пустая строка

, например:

text11  text12  text13 
text121 text122 text123 
text131 text132 text133

text21  text22   text23 
text221 text222 text223
text231 text232 text233
text241 text242 text243

Есть ли способ сделать это только с помощью awk?

Я пробовал что-то вроде этого:

cat file.txt | awk 'gsub(" ","\n"); gsub("\n", "\n\n",$NR)'

, но это, конечно, не работает.

Ответы [ 4 ]

1 голос
/ 28 января 2020
$ awk -v ORS='\n\n' '{gsub(FS,RS); gsub(/\|/,OFS)} 1' file
text11 text12 text13
text121 text122 text123
text131 text132 text133

text21 text22 text23
text221 text222 text223
text231 text232 text233
text241 text242 text243
1 голос
/ 28 января 2020

Другое, разница, вероятно, в gsub(/$/,"\n"):

$ awk '{gsub(/ /,"\n");gsub(/\|/," ");sub(/$/,"\n")}1' file

Вывод:

text11 text12 text13
text121 text122 text123
text131 text132 text133

text21 text22 text23
text221 text222 text223
text231 text232 text233
text241 text242 text243
1 голос
/ 28 января 2020

Не могли бы вы попробовать следующее.

awk '{gsub(/\r/,"");gsub(FS,ORS);gsub(/\|/,OFS)} 1'  Input_file

ИЛИ

awk '{gsub(/\r/,"");gsub(/ /,ORS);gsub(/\|/,OFS)} 1'  Input_file

ИЛИ

awk '{gsub(/\r/,"");gsub(/ /,"\n");gsub(/\|/,OFS)} 1'  Input_file

Объяснение: Добавление подробного объяснения приведенного выше кода. Это только для пояснения.

awk '              ##Starting awk program from here.
{                  ##Starting main BLOCK of program from here.
  gsub(FS,ORS)     ##Globally substituting spaces with new lines here.
  gsub(/\|/,OFS)   ##Globally substituting pipe with space for all occurrences of current line.
}                  ##Closing main BLOCK of this line here.
1                  ##Mentioning 1 will print edited/non-edited lines here.
'  Input_file      ##Mentioning Input_file name here.
0 голосов
/ 28 января 2020

Простой, не идиоматический c подход может быть следующим:

awk '{for(i=1;i<=NF;i++){gsub(/\|/, " ", $i);print $i} print ""}' file

Объяснение:

{
    # Iterate through the input fields, which are split by space
    # Note: NF is the number of input fields
    for(i=1; i<=NF; i++) {
        # replace all pipes by space
        gsub(/\|/, " ", $i)
        # and print
        print $i
    }
    # Additional newline
    print "" 
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...