AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / unix / Perguntas / 563801
Accepted
Ken Ingram
Ken Ingram
Asked: 2020-01-24 22:38:23 +0800 CST2020-01-24 22:38:23 +0800 CST 2020-01-24 22:38:23 +0800 CST

Como remover o CRLF da coluna awk $NF

  • 772

Não tenho certeza de como formular a pergunta, pois a maioria das respostas é sobre a remoção \r\nde um arquivo.

Eu tenho um problema único em que os arquivos compactados são numerados aleatoriamente e, para associá-los adequadamente a um registro do banco de dados, preciso listar o conteúdo do arquivo e verificá-lo.

Estou usando essas soluções "No script bash, como capturar stdout linha por linha"

O que foi um ótimo começo.

Alguns dos conteúdos têm um nome com espaço em branco e encontrei esta solução: Como imprimir a terceira coluna na última coluna?

Descobri ao tentar atualizar o registro do banco de dados, que ^Mestá sendo inserido nos resultados do awkpipe, mas apenas para a NFcoluna.

Não tenho certeza de como resolver essa falha específica. Não vejo onde ^Mestá sendo inserido, ou como removê-lo da última coluna.

Meu código

Esta linha funciona bem se eu tirar^M

filename="$(echo "$line" | awk '{if ($3 ~ /^M$/) {sub(/^M$/,"", $3)} printf $3; printf ""}')"

Esta linha falha:

text="$(echo "$line" | awk '{for(i=6;i<NF+1;i++) {if ($i ~ /^M$/) {sub(/^M$/,"", $i)} } printf "%s ", $i; printf ""}')"

E a versão simplificada falha:

text="$(echo "$line" | awk '{for(i=6;i<NF+1;i++) sub(/^M$/,"", $i) printf "%s ", $i; printf ""}')"

In vim/ vi ^Mé criado com ctrl-V + <return key> Using \r\nnão tem efeito.

Estou usando cygwin, e tenho usado há muito tempo, e tenho outros *nixscripts que escrevi que funcionam bem. Descobri que, por algum motivo, essa execução específica awkestá aumentando ^Ma saída.

Encontrei esta pergunta com um problema semelhante, mas criei meu script vimdesde o início, para que não houvesse editor baseado em janelas envolvido.

Se eu montar essa pasta do Windows como um compartilhamento de samba e executar o script do linux, ele produzirá a saída sem um ^M, então neste momento estou me perguntando se isso é um bug ou outra coisa. É realmente estranho.

UPDATE Meu uso do REGEX em sub() estava fazendo com que a string retornasse vazia, então não entendi corretamente como limpar o CRLF.

NF+1 foi um resquício da tentativa de descobrir o que estava introduzindo o CRLF que eu estava usando i<=NF antes disso.

bash shell-script
  • 2 2 respostas
  • 3299 Views

2 respostas

  • Voted
  1. Stéphane Chazelas
    2020-01-24T23:25:02+08:002020-01-24T23:25:02+08:00

    Com algumas implementações awkincluindo GNU awke mawkbusybox awk(as 3 implementações comumente encontradas em sistemas baseados em Linux, Cygwin sendo GNU awkpor padrão, acredito), RSo separador de registro de entrada pode ser uma expressão regular (em oposição a um único caractere em POSIX) .

    Neles, você pode fazer:

    awk -v RS='\r\n' '{print $NF}' < your-file.msdos
    

    para processar esses arquivos, ou:

    awk -v RS='\r?\n' '{print $NF}' < your-file.msdos-or-unix
    

    para poder processar ambos os arquivos com \ndelimitadores ou \r\nseparadores.

    alguns arquivos do MS-DOS também tendem a ter a última linha não delimitada, mas awktambém corrigirão isso na saída, pois anexa o separador de registro de saída ( ORSque permanece \naqui) a todos os registros durante a impressão.

    No que diz respeito à divisão de campo padrão awk, você também descobrirá que há variação entre as implementações. POSIX diz que deve ser dividido em sequências de espaços em branco , à esquerda e à direita removidos. A noção de espaço em branco depende da localidade e inclui pelo menos SPC e TAB. Você encontrará muitas awkimplementações que o restringem apenas a SPC e TAB, independentemente da localidade, muitas também adicionam NL (relevante apenas quando o separador de registro não é nova linha).

    busyboxawk inclui todos os espaços em branco ASCII, incluindo CR, FF, VT. Portanto, no busybox awk, os campos por padrão nunca contêm CR. Você pode obter o mesmo comportamento com o GNU awkfazendo gawk -v 'FPAT=[^[:space:]]'where os campos são definidos como sequências de não espaços em branco.

    Mais algumas notas:

    • evite loops de shell para processar text , especialmente aqui já que você já está usando awkque é uma das ferramentas certas para processar texto.
    • não use echoem dados arbitrários
    • o primeiro argumento printfé o formato, você não quer usar dados arbitrários lá. Use printf "%s", $3se quiser imprimir $3sem anexar ORS, não printf $3.
    • printf ""é um não-op. Não faz nada. Se você quiser imprimir uma nova linha, use printf "\n"ou print ""(o último imprime ORS, nova linha por padrão).
    • 7
  2. Best Answer
    Inian
    2020-01-24T22:46:07+08:002020-01-24T22:46:07+08:00

    awknão identifica o ^Mliteralmente, ele o identifica como o padrão CRLF \r\n, então você sub()pode usar a representação do caractere CR diretamente como abaixo. Além disso, você não precisa verificar se o campo contém um caractere e fazer uma substituição. As funções de substituição simplesmente não fazem nada se o padrão mencionado não for encontrado. Portanto, tudo o que você precisa é o seguinte para substituir o CR apenas na última coluna.

    awk '{ sub("\r", "", $NF); print $NF }' 
    

    Se houver várias colunas que precisam ser substituídas, alterne $NFcom a coluna apropriada necessária.

    Se você estiver fazendo isso em um loop para todas as colunas até o final do arquivo, apenas faça

    awk '{ for(i=6; i<=NF ; i++) { sub("\r", "", $i); printf "%s ", $i; } }'
    

    Além disso, o arquivo só pode ter NFcolunas máximas e $NFé o último valor da coluna. Altere seu loop para executar até NFacessar o último valor da coluna.

    • 1

relate perguntas

  • Problema estranho ao passar variáveis ​​do arquivo de texto

  • Enquanto a linha lê mantendo os espaços de escape?

  • MySQL Select com função IN () com array bash

  • ordem de substituição de processos `te` e `bash`

  • Execute um script muito lento até que seja bem-sucedido

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Possível firmware ausente /lib/firmware/i915/* para o módulo i915

    • 3 respostas
  • Marko Smith

    Falha ao buscar o repositório de backports jessie

    • 4 respostas
  • Marko Smith

    Como exportar uma chave privada GPG e uma chave pública para um arquivo

    • 4 respostas
  • Marko Smith

    Como podemos executar um comando armazenado em uma variável?

    • 5 respostas
  • Marko Smith

    Como configurar o systemd-resolved e o systemd-networkd para usar o servidor DNS local para resolver domínios locais e o servidor DNS remoto para domínios remotos?

    • 3 respostas
  • Marko Smith

    apt-get update error no Kali Linux após a atualização do dist [duplicado]

    • 2 respostas
  • Marko Smith

    Como ver as últimas linhas x do log de serviço systemctl

    • 5 respostas
  • Marko Smith

    Nano - pule para o final do arquivo

    • 8 respostas
  • Marko Smith

    erro grub: você precisa carregar o kernel primeiro

    • 4 respostas
  • Marko Smith

    Como baixar o pacote não instalá-lo com o comando apt-get?

    • 7 respostas
  • Martin Hope
    user12345 Falha ao buscar o repositório de backports jessie 2019-03-27 04:39:28 +0800 CST
  • Martin Hope
    Carl Por que a maioria dos exemplos do systemd contém WantedBy=multi-user.target? 2019-03-15 11:49:25 +0800 CST
  • Martin Hope
    rocky Como exportar uma chave privada GPG e uma chave pública para um arquivo 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Evan Carroll status systemctl mostra: "Estado: degradado" 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim Como podemos executar um comando armazenado em uma variável? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S Por que /dev/null é um arquivo? Por que sua função não é implementada como um programa simples? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 Como ver as últimas linhas x do log de serviço systemctl 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - pule para o final do arquivo 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla Por que verdadeiro e falso são tão grandes? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis Substitua a string em um arquivo de texto enorme (70 GB), uma linha 2017-12-30 06:58:33 +0800 CST

Hot tag

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve