Распечатать переменную колонку, используя awk - PullRequest
0 голосов
/ 29 августа 2018

Я пытаюсь отфильтровать некоторые почтовые журналы, и мне нужно получить определенную информацию из определенных столбцов, которые не всегда совпадают. Информация может быть в разных столбцах каждой строки. Я всегда использую awk для печати только нужных мне столбцов, например:

cat file.log | awk '{print $1" "$2" "$3}' >> output.txt

но в этом случае я не знаю, в каком столбце содержится искомая строка.

Пример file.log, где я ищу столбцы, содержащие строку «5»:

A B C 222 586 999 724 644  
A B C 510 333 987 678 633  
A B C 348 488 920 566 240  

Результат, который я хочу:

A B C 586  
A B C 510  
A B C 566  

Любая помощь приветствуется

Ответы [ 3 ]

0 голосов
/ 30 августа 2018
$ awk '{
    for(i=4;i<=NF;i++)    # iterate fields starting from the 4th
        if($i~/5/)        # if there is a 5 in the field
            $3=$3 OFS $i  # append field value to the 3rd field
    print $1,$2,$3        # output 1st thru 3rd
}' file

Output:

A B C 586
A B C 510
A B C 566
0 голосов
/ 30 августа 2018

хитрый perl, один вкладыш

perl -anE 'say "@{[ @F[0..2], grep {/5/} @F[3..$#F] ]}"' file

, где

  • -n перебирает входной файл по строке
  • -a разбивает каждую строку на слова и сохраняет в массиве @F
  • @F[0..2] - первые 3 слова; @F[3..$#F] список от 4-го до последнего слова
  • grep {/5/} фильтрует список, возвращая только слова, содержащие "5"
  • "@{[ ... ]}" - это синтаксический трюк для преобразования списка в разделенный пробелами.

Можно также использовать это, так же сложно, но немного менее "синтаксис-у"

perl -anE 'push @F, grep {/5/} splice @F,3; say "@F"'
0 голосов
/ 29 августа 2018

Используя ~ /5/ и итерируя по каждому столбцу в каждой строке / строке ( KISS ):

$ awk '
    {
        for (i=1; i<=NF; i++) {
            if (i==1 || i==2 || i==3 || $i ~ /5/) {
                printf "%s ", $i
            }
         }
         print ""
    }
' file

Выход:

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