AwK выравнивает более длинные столбцы по следующей строке и сохраняет одинаковое количество обработанных строк/строк.

Привет, у меня есть эта проблема с этим типом входных данных:

входной файл, который содержит эти столбцы:

файл1 (исходный файл)

7 LINE_A G_VALUEFA D_VALUEFA SEAT01 SEAT02 SEAT03 SEAT04      
7 LINE_B G_VALUEFA D_VALUEFA SEAT22 SEAT25 SEAT27 EXNUM899999SSSSS9S8S5S2S8 EXNUM899999SSSSS9S8S5S2S8 EXNUM899999SSSSS9S8S5S2S8 EXNUM899999SSSSS9S8S5S2S8
7 LINE_C G_PREFX D_VALUEFX SEAT01 SEAT02 SEAT03 SEAT04      
8 LINE_G G_PREFX D_VALUEFX POSITION55 POSITION82 VALUE85 POSITION44 POSITION448 POSITION448 POSITION448
7 LINE_C G_PREFA D_VALUEFA SEAT01 SEAT02 SEAT03 

5 Lines processed

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

awk '{for (i = 1; i <= NF; i += 9) print $i, $(i+1), $(i+2), $(i+3), $(i+4), $(i+5), $(i+6), $(i+7), $(i+8), $(i+9)}' file1

file1 (обработанный файл)

7 LINE_A G_VALUEFA D_VALUEFA SEAT01 SEAT02 SEAT03 SEAT04
7 LINE_B G_VALUEFA D_VALUEFA SEAT22 SEAT25 SEAT27 EXNUM899999SSSSS9S8S5S2S8 EXNUM899999SSSSS9S8S5S2S8 EXNUM899999SSSSS9S8S5S2S8
EXNUM899999SSSSS9S8S5S2S8
7 LINE_C G_PREFX D_VALUEFX SEAT01 SEAT02 SEAT03 SEAT04
8 LINE_G G_PREFX D_VALUEFX POSITION55 POSITION82 VALUE85 POSITION44 POSITION448 POSITION448
POSITION448 
7 LINE_C G_PREFA D_VALUEFA SEAT01 SEAT02 SEAT03

7 Lines processed

@Цель состоит в том, чтобы сделать вывод таким же или даже лучше, основываясь на вашей идее, но при этом сохранить такое же количество обработанных строк.

7 LINE_A G_VALUEFA D_VALUEFA SEAT01 SEAT02 SEAT03 SEAT04
7 LINE_B G_VALUEFA D_VALUEFA SEAT22 SEAT25 SEAT27 EXNUM899999SSSSS9S8S5S2S8 EXNUM899999SSSSS9S8S5S2S8 EXNUM899999SSSSS9S8S5S2S8
          EXNUM899999SSSSS9S8S5S2S8
7 LINE_C G_PREFX D_VALUEFX SEAT01 SEAT02 SEAT03 SEAT04
8 LINE_G G_PREFX D_VALUEFX POSITION55 POSITION82 VALUE85 POSITION44 POSITION448 POSITION448
          POSITION448 
7 LINE_C G_PREFA D_VALUEFA SEAT01 SEAT02 SEAT03

5 Lines processed  

для подсчета я использую этот код ниже: но после сокращения с помощью кода цикла AWK это приводит к NR строк 7

awk '{print $0;NR;}END {print "\n" "\033[48;5;085;38;5;000m" NR, "Lines processed""\033[0m";}'

Спасибо за любые идеи с этим


person ya801    schedule 24.08.2018    source источник
comment
Вы говорите, что хотите обернуть длинные строки с некоторым количеством символов или некоторым количеством полей и сделать отступ для обернутых строк? Если да, то что это за число и это символы или поля? Если нет - уточните, что вы пытаетесь сделать.   -  person Ed Morton    schedule 25.08.2018
comment
почему бы не сделать и то, и другое в одном скрипте, чтобы не потерять счет количества строк? И что такое обработка, кроме переноса текста?   -  person karakfa    schedule 25.08.2018
comment
ну, на самом деле я хотел бы обернуть длинные строки в некоторое количество полей (я использую имя здесь в качестве столбцов), возможно, это вызывает недопонимание здесь, число равно 9. Я хотел бы обернуть более длинные строки и красиво связать их со следующей строкой с помощью сохранение или возврат количества обработанных строк (строк)   -  person ya801    schedule 25.08.2018
comment
@karakfa, ну да ладно, вот так:` awk '{print $0;NR;}END {print \n \033[48;5;085;38;5;000m NR, обработано строк\033[0m;}' файл1 | awk '{для (i = 1; i ‹= NF; i += 9) выведите $i, $(i+1), $(i+2), $(i+3), $(i+4) , $(i+5), $(i+6), $(i+7), $(i+8), $(i+9)}' ` ` но все равно как-то не хватает красивой упаковки, так как я потерялся здесь   -  person ya801    schedule 25.08.2018


Ответы (1)


это то, что вы ищете?

$ cat file
7 LINE_A G_VALUEFA D_VALUEFA SEAT01 SEAT02 SEAT03 SEAT04
7 LINE_B G_VALUEFA D_VALUEFA SEAT22 SEAT25 SEAT27 EXNUM899999SSSSS9S8S5S2S8 EXNUM899999SSSSS9S8S5S2S8 EXNUM899999SSSSS9S8S5S2S8
7 LINE_C G_PREFX D_VALUEFX SEAT01 SEAT02 SEAT03 SEAT04
8 LINE_G G_PREFX D_VALUEFX POSITION55 POSITION82 VALUE85 POSITION44 POSITION448 POSITION448 POSITION448
7 LINE_C G_PREFA D_VALUEFA SEAT01 SEAT02 SEAT03

$ cat tst.awk
{
    for (i=1; i<=NF; i++) {
        printf "%s%s", $i, (i<NF ? (i%9 ? OFS : ORS "\t") : ORS)
    }
}

$ awk -f tst.awk file
7 LINE_A G_VALUEFA D_VALUEFA SEAT01 SEAT02 SEAT03 SEAT04
7 LINE_B G_VALUEFA D_VALUEFA SEAT22 SEAT25 SEAT27 EXNUM899999SSSSS9S8S5S2S8 EXNUM899999SSSSS9S8S5S2S8
        EXNUM899999SSSSS9S8S5S2S8
7 LINE_C G_PREFX D_VALUEFX SEAT01 SEAT02 SEAT03 SEAT04
8 LINE_G G_PREFX D_VALUEFX POSITION55 POSITION82 VALUE85 POSITION44 POSITION448
        POSITION448 POSITION448
7 LINE_C G_PREFA D_VALUEFA SEAT01 SEAT02 SEAT03

$ awk -f tst.awk file | awk '!/^\t/{++c} END{print c+0, "Lines processed"}'
5 Lines processed

Очевидно, вы могли бы просто напечатать NR в конце первого сценария, если хотите напечатать там число «Обработанных строк», поэтому я предполагаю, что вы хотите напечатать его из какого-то последующего сценария, хотя я не могу представить, почему.

person Ed Morton    schedule 24.08.2018
comment
вы правы, это то, что я искал, просто оберните и немного переместите его с помощью \t, я адаптирую это, спасибо, теперь я немного разобрался с этой обработкой, хорошего дня - person ya801; 25.08.2018