Saltar a contenido

Bash Leer archivo separado por comas cvs CSV

Para leer valores separados por coma desde una variable bash:

Sin cambiar el IFS, ni programas externos:

variable=abc,def,ghij
for i in ${variable//,/ }
do
    # llamar comandos y procedimientos
    echo "$i"
done

SALIDA:
abc
def
ghij


# Cambiando el IFS:

oldIFS==$IFS
var=a,b,c,d

IFS=, read -a vector <<< "$var"

for i in "${vector[@]}"; do echo "$i"; done

SALIDA:
a
b
c
d

Si es un archivo con valores de columnas separados por comas:

#para un archivo llamado foo con este contenido

[IP ADRESS], [ID-Number], [Name]
[IP ADRESS], [ID-Number], [Name]
[IP ADRESS], [ID-Number], [Name]

* Entonces, para imprimir la dirección IP de cada línea, use:
$ awk -F', ' '{print $1}' < foo

* Para imprimir el número de identificación de cada línea, utilice:
$ awk -F', ' '{print $2}' < foo

* Para imprimir el nombre de cada línea, utilice:
$ awk -F', ' '{print $3}' < foo

* También es posible crear una awkdeclaración única que cree una salida que combine los distintos campos de entrada:
$ awk -F', ' '{print "ssh " $1 " /path/to/myscript.sh " $2 " " $3}' < foo

* Una vez que haya revisado el resultado de esa declaración para asegurarse de que sea precisa y efectiva para sus propósitos, puede ejecutarla fácilmente conectándola a un shell:

$ awk -F', ' '{print "ssh " $1 " /path/to/myscript.sh " $2 " " $3}' < foo | bash

Verificar si una cadena está presente en una lista de cadenas separadas por comas:

Me gustaría conocer una manera ordenada en la que pueda verificar si hay una cadena en un valor de cadenas separado por comas. por ejemplo: si

x="abc,def,ghi"
y="abc"

debería volver verdadero
y si
y="ab"

RESPUESTA:

19


Podrías usar globos:

[[ ",$x," = *",$y,"* ]]

Expresion regular para validar cadena separada por comas:

de https://stackoverflow.com/questions/6448573/regular-expression-help-comma-delimited-string ^[0-9a-zA-Z]+(,[0-9a-zA-Z]+)*$

Convierte filas separadas por comas en 1 columna.

bob,john,jane,sam,joyce

$ IFS=, read -a names <<< "bob,john,jane,sam,joyce"
$ printf "%s\n" "${names[@]}"
bob
john
jane
sam
joyce

tambien de esta forma:
awk:

$ echo "bob,john,jane,sam,joyce" | awk -F, -v OFS="\n" '{$1=$1; print}'
bob
john
jane
sam
joyce

Analizar filas separadas por comas:

de https://www.cyberciti.biz/faq/unix-linux-bash-read-comma-separated-cvsfile/

La sintaxis es la siguiente frase en un archivo CSV llamado input.csv:

while IFS=, read -r field1 field2
do
    echo "$field1 and $field2"
done < input.csv

Cómo analizar un archivo CSV en Bash:

#!/bin/bash
# Purpose: Read Comma Separated CSV File
# Author: Vivek Gite under GPL v2.0+
# ------------------------------------------
INPUT=data.csv
OLDIFS=$IFS
IFS=','
[ ! -f $INPUT ] && { echo "$INPUT file not found"; exit 99; }
while read flname dob ssn tel status
do
    echo "Name : $flname"
    echo "DOB : $dob"
    echo "SSN : $ssn"
    echo "Telephone : $tel"
    echo "Status : $status"
done < $INPUT
IFS=$OLDIFS

Tratar con datos/valores o campos faltantes:

#!/bin/bash
missing=false
while IFS=, read -r field1 field2
do
    if [ "$field1" == "" ]
    then
        echo "field1 is empty or no value set"
        missing=true
    elif [ "$field2" == "" ]
    then
        echo "field2 is empty or no value set"
        missing=true
    else
        echo "$field1 and $field2"
    fi
done < input.csv
if [ $missing ]
then
    echo "WARNING: Missing values in a CSV file. Please use the proper format. Operation failed."
    exit 1
else
    echo "CSV file read successfully."
fi

Muchos programas de utilidad de línea de comandos de Linux y Unix, como cortar, pegar, unir, ordenar, uniq, awk, sed, pueden dividir archivos en un delimitador de coma y, por lo tanto, pueden procesar archivos CSV simples. Por ejemplo:

awk -F',' '{ print $1 " " $2 }'