Edição de coluna usando awk ou sed. como imprimir o seguinte padrão?

2

Sample Input:

title          role        subject
name-JOHN      student      math
school         state        NY
county         street       Phone
name-TOM       student      math
school         state        TX
county         street       Phone
name-LILLY     student      math
school         state        LA
county         street       Phone
name-ROSY      student      math
school         state        WA
county         street       Phone
garbage line 1
garbage line 2

Desired Output

JOHN     NY
TOM      TX
LILLY    LA
ROSY     WA

bottom 2 As linhas de lixo devem desaparecer. eu quero usar AWk ou SED?

Estou executando o Sun OS.

    
por ayrton_senna 19.05.2015 / 00:26

4 respostas

3

Aqui está outro jeito estranho (que, vejo agora, é apenas uma versão mais feia do @Costas's):

$ awk -F'[- ]' '($1~/name/){k=$2}($1~/school/){print k,$NF}' file
JOHN NY
TOM TX
LILLY LA
ROSY WA

Você também pode usar grep :

$ grep -oP '^(name-\K\S+|school.*\s+\K.*)' file | paste - -
JOHN    NY
TOM TX
LILLY   LA
ROSY    WA

Em seu exemplo específico, é claro, você pode procurar por letras maiúsculas:

$ grep -Eo '[A-Z]{2,}' file | paste - -

Ou perl:

$ perl -lne '$n=$1 if /^name-(\S+)/; /^school.*\s+(.+)/ && print "$n\t$1"' file

Ou outro perl:

$ perl -007ne 'print join "\n", (/name-(\S+?)\s.*?state\s+(..)\n/gsm)' file | paste - -
    
por 19.05.2015 / 00:51
5

Por GNU sed

sed -n '/^name-/{s///;N;s/[a-z].*\s//p}' file
JOHN      NY
TOM       TX
LILLY     LA
ROSY      WA

Por GNU awk

awk -F'[ -]+' '/name/{a=$2}/state/{print a,$3}' OFS='\t' file
JOHN    NY
TOM     TX
LILLY   LA
ROSY    WA

Por grep

grep -o '[[:upper:]]\{2,\}' file | paste - -
JOHN    NY
TOM     TX
LILLY   LA
ROSY    WA
    
por 19.05.2015 / 00:36
2
awk '/name/ {gsub(/name-/,""); printf "%s\t",$1} /school/ {print $3}' file
JOHN    NY
TOM     TX
LILLY   LA
ROSY    WA
    
por 19.05.2015 / 00:30
0

Só para deixar claro, você está usando o "antigo awk " ( /usr/bin/awk/ ) ou o "novo awk " ( /usr/xpg6/bin/awk )? Uma referência de página man man e A página de ajuda do GNU Awk especifica a distinção claramente.

Assumindo que você está se referindo a "novo awk ", onde você pode usar atribuições de variáveis via -v , você também pode considerar isto:

$ awk -v RS='name-' -v OFS='\t' 'NR>1{print $1,$6}' sample.txt
JOHN    NY
TOM     TX
LILLY   LA
ROSY    WA

Definimos o separador de registro ( -v RS='name-' ) para que awk interprete o nome e o estado como os primeiros ( $1 ) e sexto ( $6 ) campos respectivamente. Em seguida, também definimos o separador de campo output ( -v OFS='\t' ) para executar a formatação desejada. A condição NR>1 é apenas para pular a primeira linha.

editar

awk 'BEGIN{RS="name-";OFS="\t"}NR>1{print $1,$6}' sample.txt

Isso deve ser possível mesmo para "old awk ", por favor, teste-o. Mantendo a sugestão inicial "new awk " ainda.

    
por 19.05.2015 / 12:55

Tags