Распечатать значение со следующей строки

xeyes — это хороший способ проверить, настроен ли X11 на удаленных системах. Я использую его для проверки работоспособности графического туннеля перед запуском VisualVM.

1
15.02.2020, 23:29
3 ответа

Вот решение с awk, поскольку это то, о чем вы просили. Решение справедливо для любого количества записей в вашем файле данных с именем datafile:

.
$ awk 'BEGIN {print "FirstName,LastName,Gender,DOB"}
       /User Name:|Gender:/ {dob=0;rtp=NR+1} 
       NR==rtp && dob==0 {printf $1 $2 ","} 
       /DOB:/ {dob=1;rtp=NR+1} 
       NR==rtp && dob==1 {print $1}' datafile
[output]
FirstName,LastName,Gender,DOB
Joe,Neo,M,3/20/2000

Строка 1:заголовок вывода на печать :«Имя, Фамилия, Пол, Дата рождения»

Строка 2.:Если запись содержит «Имя пользователя :» или «Пол :», установите внутренние переменные dob и rtp в 0 и NR+1 соответственно.

Строка 3 :, если номер записи rtp и dob равен 0, вывести два первых поля, если они не пусты -

Строка 4:если запись содержит "DOB :", установите внутренние переменные dob и rtp в 1 и NR+1 соответственно.

Строка 5 :, если номер записи — rtp, а dob — 1, вывести первое поле.

1
28.04.2021, 23:23

Предположим, что ваш реальный входной файл содержит более 1 записи, например.:

$ cat file
User Charts
User ID:
40944827
User Name:
Joe, Neo
Gender:
M
DOB:
3/20/2000 12:00:00 AM - Age: 20 yr. 10 mo. old
User ID:
1234
User Name:
Bob, Slob
Gender:
X
DOB:
5/28/2000 12:00:00 AM - Age: 20 yr. 10 mo. old

Вот как вы можете преобразовать это в CSV, не связывая код со значениями входных строк:

$ cat tst.awk
BEGIN { OFS="," }
NR==1   { next }
!(NR%2) { sub(/:.*/,""); hdrs[++numFlds]=$0 }
NR%2    { vals[numFlds]=$0 }
!((NR-1)%8) {
    if ( !doneHdr++ ) {
        for (fldNr=1; fldNr<=numFlds; fldNr++) {
            printf "\"%s\"%s", hdrs[fldNr], (fldNr<numFlds ? OFS : ORS)
        }
    }
    for (fldNr=1; fldNr<=numFlds; fldNr++) {
        printf "\"%s\"%s", vals[fldNr], (fldNr<numFlds ? OFS : ORS)
    }
    numFlds = 0
}

$ awk -f tst.awk file
"User ID","User Name","Gender","DOB"
"40944827","Joe, Neo","M","3/20/2000 12:00:00 AM - Age: 20 yr. 10 mo. old"
"1234","Bob, Slob","X","5/28/2000 12:00:00 AM - Age: 20 yr. 10 mo. old"

Это не совсем тот результат, который вы искали, но на самом деле он может быть более полезным для вас, и, надеюсь, вы видите, что это просто настройка в циклах forдля принятия любых решений на основе значений данных и изменения вывода для выбранное поле (s )как вам нравится.

1
28.04.2021, 23:23

Вот решение с помощью sed:

sed -e 'N;N;N;N;N;N;N;N;s/.*Name:\n\([^[:space:]]*, [^[:space:]]*\)\nGender:\n\(.\)\nDOB:\n\([^[:space:]]*\).*/LastName, First Name,Gender,DOB\n\n\1,\2,\3/'  

поэтому я думаю, что вывод должен выглядеть примерно так :;-)

sed -e 'N;N;N;N;N;N;N;N;s/.*Name:\n\([^[:space:]]*, [^[:space:]]*\)\nGender:\n\(.\)\nDOB:\n\([^[:space:]]*\).*/LastName, FirstName, Gender, DOB\n\n\1, \2, \3/'  
0
28.04.2021, 23:23

Теги

Похожие вопросы