Uso del delimitador de tabulación en Cortar en Unix Shell Scripting

Tengo el file input.txt con los datos a continuación en formatting delimitado por TAB-

 23776112 Inactive Active 23415312 Inactive Active 

Según el requisito, dentro del ciclo while, quiero usar los datos de la primera columna de corte e imprimirlo –

A continuación está la parte de código

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

Para usar la pestaña como delimitador de arriba, estoy usando Ctrl V Tab

Pero el resultado no es el esperado. Estoy obteniendo O / P-

 23776112 Inactive Active 23415312 Inactive Active 

Mientras que yo quiero O / P como –

 23776112 23415312 

 cut -f 1 input.txt 

Esto le proporciona la primera columna del file delimitado por tabuladores input.txt . El delimitador de campo pnetworkingeterminado para el cut es el carácter de tabulación, por lo que no es necesario especificarlo con mayor detalle.

Si el delimitador es en realidad un espacio, use

 cut -d ' ' -f 1 input.txt 

Si resulta que hay varias tabs y / o espacios, use awk :

 awk '{ print $1 }' input.txt 

El bucle de shell no es necesario para esta operación, independientemente de si usa cut o awk .

Consulte también " ¿Por qué usar un bucle de shell para procesar text se considera una mala práctica? ".


La razón por la cual su script no funciona es porque la pestaña desaparece cuando repite la variable sin comillas.

Relacionado:

  • ¿Por qué printf es mejor que echo?

  • Implicaciones de security de olvidarse de citar una variable en shell Bash / POSIX

Tab es el separador pnetworkingeterminado para cut , no necesita un argumento explícito para él.

Sin embargo, debe citar su variable para evitar que las tabs se conviertan en espacio.

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

Pero también puedes evitar usar el cut en primer lugar. Simplemente configure IFS en \t .

 IFS=$'\t' while read -r SN rest do echo "$SN" done < input.txt 

Bash interpreta

 $'\t' 

como tabulador, entonces

 cut -d $'\t' -f 1 

es la forma de decir cut para usar el tabulador como separador (que, sin embargo, es networkingundante, ya que es el pnetworkingeterminado). Sin embargo, preferiría awk con la misma syntax:

 awk -v FS=$'\t' '{ print $1 }' < input.txt