Usando o delimitador de tabulação em Recortar no Unix Shell Scripting [duplicado]

3

Eu tenho o arquivo input.txt com os dados abaixo no formato delimitado por TAB -

23776112        Inactive        Active
23415312        Inactive        Active

Como por exigência, dentro do loop while, eu quero usar os dados da primeira coluna cortados e imprimi-los -

Abaixo está a parte do código -

......
......
    while read line
    do  
        SN='echo ${line}|cut -d '       ' -f1'
        echo $SN
    done < input.txt
....
....

Para usar a tabulação como delimitador acima, estou usando o Ctrl V Tab

Mas a saída não é a esperada. Estou recebendo O / P -

23776112 Inactive Active
23415312 Inactive Active

Considerando que eu quero O / P como -

23776112 
23415312
    
por Praveen Verma 26.09.2017 / 15:32

3 respostas

12
cut -f 1 input.txt

Isso fornece a primeira coluna do arquivo delimitado por tabulação input.txt . O delimitador de campo padrão para cut é o caractere de tabulação, portanto não há necessidade de especificar isso ainda mais.

Se o delimitador for na verdade um espaço, use

cut -d ' ' -f 1 input.txt

Se houver várias guias e / ou espaços , use awk :

awk '{ print $1 }' input.txt

O loop do shell não é necessário para esta operação, independentemente de você usar cut ou awk .

Veja também " Por que usar um loop de shell para processar texto considerado uma prática ruim? ".

O motivo pelo qual seu script não funciona é porque a guia desaparece quando você usa echo da variável não indicada.

Relacionados:

por 26.09.2017 / 15:38
2

Tab é o separador padrão para cut , você não precisa de um argumento explícito para isso.

No entanto, você precisa citar sua variável para evitar que as guias sejam transformadas em espaço.

SN='echo "${line}"|cut -f1'

Mas você também pode evitar usar cut em primeiro lugar. Basta definir IFS para \t .

IFS=$'\t'
while read -r SN rest
do 
    echo "$SN"
done < input.txt
    
por 26.09.2017 / 19:24
1

bash interpreta

$'\t'

como tabulador, então

cut -d $'\t' -f 1

é a maneira de informar cut para usar o tabulador como separador (que, no entanto, é redunant, pois é o padrão). No entanto, eu preferiria o awk com a mesma sintaxe:

awk -v FS=$'\t' '{ print $1 }' < input.txt
    
por 26.09.2017 / 17:31