Ok, já que essa é uma pergunta complexa, vou explicar claramente. Eu tenho um conteúdo de arquivo mostrado como abaixo:
$ Cat File1
ABC Cool Lol POP {MNB}
ABC Cool Lol POP {MNB}
ABC Cool Lol POP {MNB}
ABC Cool Lol POP {TBMKF}
ABC Cool Lol POP {YUKER}
ABC Cool Lol POP {EFEFVD}
A saída que eu quero
-Cool MNB + POP ;
-Cool MNB + POP ;
-Cool MNB + POP ;
-Cool TBMKF + POP ;
-Cool YUKER + POP ;
-Cool EFEFVD +POP ;
Em primeiro lugar, tento retirar a última coluna da File1
e imprimi-la
sed 's/[{}//g' File1 > File3
Depois disso, copio todo o conteúdo de File1
para um novoFile4
cp File1 File4
Depois disso, substituo os dados dentro dos File4
com os File3
dados (significa os dados sem colchete uma " File1
última coluna que uma")
awk 'FNR==NR{a[NR]=$1;next}{$5=a[FNR]}1' File3 File4 >>File5
A saída deve ser assim
ABC Cool Lol POP MNB
ABC Cool Lol POP MNB
ABC Cool Lol POP MNB
ABC Cool Lol POP TBMKF
ABC Cool Lol POP YUKER
ABC Cool Lol POP EFEFVD
Finalmente tento
awk -F“ " '{print - $2,$5 +,$4 ";"}‘ File5
Mas o resultado não saiu como mostrado como eu quero, apenas os dados similares MNB estão todos listados, outros não apareceram (Arquive dados de uma última coluna),
text-processing
awk
heng960407
fonte
fonte
awk --version
, qual é o resultado?Respostas:
Não sei por que você está copiando as coisas da esquerda para a direita. A coisa simples é
Coloquei o
-
no início e;
no final.Entre nós, imprimimos
$2
porque nós queremos como é.$5
, que é a sequência sem o primeiro e o último caractere. Ignoramos o primeiro caractere começando na posição 2 (o awk sempre foi estranho sobre isso) e deixamos de fora o último caractere apenas selecionando uma substring com dois caracteres mais curtos que o original$5
+
porque nós queremos$4
No entanto, não tenho certeza se todas essas funções de string são específicas para o GNU awk.
fonte
substr(string, 2)
retorna a substring a partir do segundo personagem, comocut -c2-
,tail -n +2
,sed '2,$'
... O que é tão estranho nisso?awk
dos anos 70.Com sed
E variação awk
fonte
Trabalho fácil de TXR :
Usando a macro TXR Lisp awk para transliterar a solução Awk:
Os campos estão na
f
lista e a indexação é baseada em zero.fonte
Usar o awk é mais fácil quando os
$1,$2,...
campos já contêm as strings exatas com as quais você deseja trabalhar. O separador de campos, se contiver mais de um caractere, será interpretado como uma expressão regular. Não precisamos fazer nenhuma operação de pesquisa e substituição ou substring para nos livrarmos dos {chaves entre chaves}. Nós apenas os contamos como parte do delimitador.Usar em
printf
vez deprint
também facilita um pouco a visualização de como a string será formatada, mas se você quiser, emprint "-"$2,$5" + "$4";"
vez deprintf("-%s %s + %s ;\n", $2, $5, $4)
, essa é uma opção.fonte