Como substituir uma guia por um caractere em um arquivo

0

o arquivo exibido se parece com

CHrIS   john    herzog  10001   Marketing
tim             johnson 10002   IT
ruth    bertha  Hendric 10003   HR
christ  jason   hellan  10004   Marketing

meu código:

readFile=$1

#error checking to see if the file exists and is not a directory
if [ ! -f "$readFile" ]
then
    #echo failed no param passed
    exit 1
else
    #reads in the file and stores the information into the variabel var.
    while read -r var
    do
        #echo $var
        fName=$(echo "$var" | cut -f1 | awk '{print $1}')
        mName=$(echo "$var" | cut -f2 | awk '{print $2}' | tr "\t" "x")

        echo $mName
    done < $readFile
fi

Como posso obter a guia do meio na linha 2 com tim (needs to be an X) johnson 10002 IT para alterar para um X?

    
por Chris Zog 23.02.2017 / 16:29

4 respostas

1

Tente isto:

digamos que o conteúdo é armazenado em um arquivo "arquivo"

cat file | sed -E 's/    /        x/'

daria

CHrIS   john    xherzog  10001   Marketing
tim     x         johnson 10002   IT
ruth    xbertha  Hendric 10003   HR
christ  jason   hellan  10004   Marketing

Por que escrever o sed da maneira mencionada acima, consulte isso

    
por 23.02.2017 / 16:43
4

Assumindo que esses são {tab} caracteres no espaçamento ...

Você nunca verá uma guia em awk ou tr porque ela já foi usada como o caractere separador de campo por cut .

Parece que você está tentando substituir um campo vazio por x . Se este for o caso, você pode usar construções como esta:

#!/bin/bash
#
while IFS= read -r line
do
    first=$(echo "$line" | awk -F$'\t' '{print $1}')
    middle=$(echo "$line" | awk -F$'\t' '{print $2}')
    last=$(echo "$line" | awk -F$'\t' '{print $3}')
    id=$(echo "$line" | awk -F$'\t' '{print $4}')
    dept=$(echo "$line" | awk -F$'\t' '{print $5}')

    echo "First is ${first:-x}"
    echo "Middle is ${middle:-x}"
    echo "Last is ${last:-x}"
    echo "Id is ${id:-x}"
    echo "Dept is ${dept:-x}"
    echo
done

Não podemos dividir com IFS=$'\t' read -r first middle last... porque read divide em execuções de espaços em branco (espaço, tabulação, nova linha) em vez de instâncias únicas. (Na verdade, é mais complicado do que isso; procure "Word Splitting" na página de manual para os detalhes completos).

Eu evitei usar echo "$line" | cut -f1 , etc., porque se cut ficar sem campos, ele reutilizará o último que encontrar.

Como uma alternativa para "$ {middle: -x}" você pode realmente atribuir x para a variável se ela não estiver definida com a construção ${middle:=x} . Prefixo que com o comando no-op : se você quiser que a atribuição aconteça sozinha (e não como um efeito colateral de algum outro comando):

: ${middle:=x}
echo "The middle is $middle"    # Will be 'x' if it was unset
    
por 23.02.2017 / 16:39
1

Supondo que o arquivo é delimitado por tabulação desde o início:

$ cat -t file
CHrIS^Ijohn^Iherzog^I10001^IMarketing
tim^I^Ijohnson^I10002^IIT
ruth^Ibertha^IHendric^I10003^IHR
christ^Ijason^Ihellan^I10004^IMarketing

E assumindo que a tarefa é inserir um x em qualquer campo vazio na coluna 2.

$ awk -F'\t' 'BEGIN { OFS = FS } $2 == "" { $2 = "x" } { print }' file
CHrIS   john    herzog  10001   Marketing
tim     x       johnson 10002   IT
ruth    bertha  Hendric 10003   HR
christ  jason   hellan  10004   Marketing

O script awk usará guias como separadores de entrada e saída e detectará campos vazios na coluna 2 e os alterará para x .

    
por 23.02.2017 / 18:21
0

Sed

Supondo que o seu "sed" compreenda as sequências de escape "\ t" "\ n". Existem WAs, caso isso não ocorra. Mas isso prejudicará a lógica do código.

 sed -e '
    s/\t/\n/;      # 1st field sep => \n , a char sure to not be in PS by definition
    s/\n\t/\tx\t/; # incase 2nd field empty then we will see the \n\t else not
    s/\n/\t/;      # just incase 2nd fields was nonempty, preceding would fail so deal here
' yourfile

Perl

perl -F"\t" -pale '$F[1] || s/^\S+\t(?=\t)/$&x/' yourfile
    
por 24.02.2017 / 03:30