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 / 442714
Accepted
Spike
Spike
Asked: 2018-05-10 01:49:24 +0800 CST2018-05-10 01:49:24 +0800 CST 2018-05-10 01:49:24 +0800 CST

Como imprimir o primeiro campo que está tendo o valor baseado no delimitador

  • 772

O arquivo ( myfile.txt) contém os seguintes dados:

abc#ab1=23
nrt#
#clb1aX
amd#322

Saída desejada:

abc
nrt
clb1ax
amd

eu poderia fazer assim,

for i in `cat myfile.txt` 
do 
  s1=`echo $i | cut -d'#' -f1`; 
  s2=`echo $i | cut -d'#' -f2`; 
  if [ "$s1" == "" ]; then 
    echo "$s2" 
  else
    echo "$s1"
  fi;
done;

Mas existe alguma maneira de fazer isso sem usar fore if, como usar awkou sedou cutou outra coisa em uma única linha?

shell-script awk
  • 6 6 respostas
  • 1308 Views

6 respostas

  • Voted
  1. Best Answer
    RomanPerekhrest
    2018-05-10T01:54:19+08:002018-05-10T01:54:19+08:00

    Solução curta awk:

    awk -F'#' 'NF{ print ($1 != "" ? $1 : $2) }' file
    

    A saída:

    abc
    nrt
    clb1aX
    amd
    
    • 8
  2. Iskustvo
    2018-05-10T02:00:05+08:002018-05-10T02:00:05+08:00

    Responda

    sed -i "/^#/ { s/#\(.*\)/\1/; b }
            s/#.*//" myfile.txt
    

    Ele pode ser unido em uma linha adicionando o ;após o }, mas será mais difícil lê-lo assim.

    Explicação

    sed -iMantenha as alterações no arquivo, não as grave em stdout.

    /^#/- When sedestá posicionado na linha que começa com #.

    s/#\(.*\)/\1/- Substitua a primeira ocorrência de #[everything]por [everything].

    b- Pare o trabalho na linha atual e comece a trabalhar na próxima.
    (Evita s/#.*//que o comando seja executado.)

    s/#.*//- Remova a primeira ocorrência de #[everything].
    (Isso funcionará para todas as linhas, a menos que o bcomando anterior tenha saído antes.)

    myfile.txtArquivo no qual sedirá executar.

    • 2
  3. αғsнιη
    2018-05-10T02:14:55+08:002018-05-10T02:14:55+08:00

    E se você não tivesse campos com valor ou não fosse apenas na segunda coluna? então você precisaria.

    awk -F'#' '{for(i=1; i<=NF; i++) if ($i != "") {print $i; break} }' infile
    

    Exemplo dado abaixo:

    abc#asd=123
    nrt#
    #clsdX
    ####
    ###aqui
    acn#123
    

    dará saída:

    abc
    nrt
    clsdX
    here
    acn
    

    Ou usando sede cut:

    cut -d'#' -f1 <(sed 's/^#\+//; /^$/d' infile )
    
    • O s/^#\+//remove os hashes principais #(ocorreram uma ou mais vezes)
    • O /^$/dremove linha vazia produzida após acima, onde uma linha era toda hashes #####ou remove linhas vazias no arquivo, se houver.
    • A cut -d'#' -f1impressão do primeiro campo -f1quando os arquivos são delimitados por um hash-d'#'

    Ou sedapenas:

    sed 's/^#\+//; /^$/d; s/^\([^#]*\)#.*/\1/' infile
    
    • Isso s/^\([^#]*\)#.*/\1/captura um grupo de início de correspondência desde o início da linha para qualquer coisa até um primeiro hash visto e apenas o imprime no resultado e ignora o resto.
    • 1
  4. Sundeep
    2018-05-10T03:05:20+08:002018-05-10T03:05:20+08:00

    Usando perl- assumindo apenas um único #na entrada, conforme fornecido na amostra

    $ perl -pe 's/[^#]\K#.*|^#//' ip.txt
    abc
    nrt
    clb1aX
    amd
    
    • [^#]\K#.*para excluir todos os caracteres da primeira ocorrência de #se houver um não #caractere precedendo-o
    • |^#caso contrário, remova #do início da linha


    A mesma coisa comsed

    $ sed 's/\([^#]\)#.*\|^#/\1/' ip.txt
    abc
    nrt
    clb1aX
    amd
    
    • 0
  5. ctac_
    2018-05-10T07:00:06+08:002018-05-10T07:00:06+08:00

    outro sed

    sed 's/^#*\([^#]*\).*/\1/' infile
    

    Se você deseja remover linhas apenas com ####

    sed 's/^#*\([^#]*\).*/\1/;/^$/d' infile
    
    • 0
  6. Claes Wikner
    2018-05-11T15:28:54+08:002018-05-11T15:28:54+08:00
    awk '{sub(/^#/,"")sub(/#/," &");print $1}' file
    
    abc
    nrt
    clb1aX
    amd
    
    • 0

relate perguntas

  • Um script que imprime as linhas de um arquivo com seu comprimento [fechado]

  • exportar variáveis ​​​​env programaticamente, via stdout do comando [duplicado]

  • Dividir por delimitador e concatenar problema de string

  • Embaralhamento de arquivo de várias linhas

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

Sidebar

Stats

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

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

    • 4 respostas
  • Marko Smith

    ssh Não é possível negociar: "nenhuma cifra correspondente encontrada", está rejeitando o cbc

    • 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

    Como descarregar o módulo do kernel 'nvidia-drm'?

    • 13 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
    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
    Wong Jia Hau ssh-add retorna com: "Erro ao conectar ao agente: nenhum arquivo ou diretório" 2018-08-24 23:28:13 +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
  • Martin Hope
    Bagas Sanjaya Por que o Linux usa LF como caractere de nova linha? 2017-12-20 05:48:21 +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