Desejo excluir a última coluna de um arquivo txt, enquanto não sei qual é o número da coluna. Como eu pude fazer isso?
Exemplo:
Entrada:
1223 1234 1323 ... 2222 123
1233 1234 1233 ... 3444 125
0000 5553 3455 ... 2334 222
E eu quero que minha saída seja:
1223 1234 1323 ... 2222
1233 1234 1233 ... 3444
0000 5553 3455 ... 2334
text-processing
sed
awk
perl
zara
fonte
fonte
Respostas:
Com
awk
:ou:
ou:
Embora isso pareça vodu, ele funciona. Existem três partes para cada um desses comandos do awk.
O primeiro é
NF
, que é uma pré-condição para a segunda parte.NF
é uma variável que contém o número de campos em uma linha. No AWK, as coisas são verdadeiras se não forem 0 ou string vazia""
. Portanto, a segunda parte (ondeNF
é decrementada) só acontece seNF
não for 0.A segunda parte (
NF-=1
NF--
ou--NF
) está apenas subtraindo uma daNF
variável. Isso impede que o último campo seja impresso, porque quando você altera um campo (removendo o último campo neste caso),awk
recria$0
, concatena todos os campos separados por espaço por padrão.$0
não continha mais o último campo.A parte final é
1
. Não é mágico, é apenas usado como uma expressão que significatrue
. Se umaawk
expressão for avaliada como verdadeira sem nenhuma ação associada, aawk
ação padrão seráprint $0
.fonte
--
. Uma observação, atualmente, você precisa estar;1
em conformidade com o POSIX.,
é o seu delimitador:awk -F',' 'BEGIN { OFS = FS }; NF { NF -= 1 }; 1' < in > out
Usando
grep
com PCRE:Usando o GNU
sed
:fonte
Usando Perl:
Usando
rev
+cut
:fonte
Usando o GNU sed:
De um modo mais geral, este funciona com o BSD sed no OSX, assim como o GNU sed:
fonte
Se o delimitador é sempre um único caractere (para que dois ou mais delimitadores consecutivos designem campos vazios), você pode
head
apenas a primeira linha do seu arquivo de entrada, contar os delimitadores (n
delimitadores significa que o número de campos én+1
) e usá-locut
para imprimir no1
campo st até on
quinto campo (do penúltimo ao último), por exemplo, com entrada delimitada por tabulação:ou por exemplo, com um arquivo csv :
Vou executar alguns benchmarks mais tarde, se tiver tempo, mas com uma grande quantidade de informações, acho que essa solução deve ser mais rápida do que outras soluções que usam regex, pois essa processa o mínimo na primeira linha para obter o não. de campos e, em seguida, usa o
cut
que é otimizado para este trabalho.fonte
Portably você pode usar um destes:
fonte
Usando o vim:
Abrir arquivo no vim
Vá para a primeira linha, caso o cursor seja colocado em qualquer outro lugar.
Crie uma macro denominada "q"
qq
, que vá para o final da linha atual$
, depois para o último espaçoF
(capital F, seguido de literal ESPAÇO) e exclua da posição atual até o final da linha,D
desça para a próxima linhaj
e pare a gravação de macro comq
.Agora podemos repetir nossa macro com
@q
para cada linha.Também podemos pressionar
@@
para repetir a última macro ou ainda mais fácil:repetir a macro 99 vezes.
Nota: O número não deve corresponder exatamente às linhas.
fonte
Para pessoas que têm um problema semelhante, mas com separadores de campos diferentes, esse
awk
método preservará o separador de campos corretamente:fonte