
Tengo un archivo con datos de la siguiente manera:
"google1|yoo|dummy|yes|wow|/" + VARIABLE + "/"
"google2|hub|lab|dummy|yes|/" + VARIABLE + "/"
"google3|short|lab|yoo|/" + VARIABLE + "/"
"google4|hello|good-guy|bad-girl|lol|dummy|/" + VARIABLE + "/"
"google5|good-guy|a4-123|yoo|/" + VARIABLE + "/"
"google6|bad-girl|b4-124|hub|/" + VARIABLE + "/"
Ahora quiero obtener una lista de cadenas entre el delimitador "|" (tubo).
La salida debe ser tan
yoo
dummy
yes
wow
hub
hello
good-guy
bad-girl
a4-123
b4-124
dummy
lol
short
lab
Básicamente, quiero tener valores únicos de la lista de cadenas después del filtro delimitador. Intenté usar awk como
awk -F"|" '{gsub(/\).*/,"",$2);print $2}' file
Pero obtengo datos incorrectos.
Respuesta1
Si tienes grep
con pcre
opción:
$ grep -oP '\|\K[^|]+(?=\|)' ip.txt | sort -u
a4-123
b4-124
bad-girl
dummy
good-guy
hello
hub
lab
lol
short
wow
yes
yoo
-o
imprimir solo el patrón coincidente-P
utilizar pcre expresiones regulares\|\K
Búsqueda positiva hacia atrás para ver si|
hay algo antes de que se extraiga nuestra cadena.- De manera similar,
(?=\|)
búsqueda positiva para ver si hay algo|
después de nuestra cadena para extraer.
- De manera similar,
[^|]+
cadena que se va a extraer: simplemente niegue|
y obtenga uno o más de esos caracteressort -u
para obtener un valor único
Si desea conservar el orden en el que se encuentran estas cadenas:
$ grep -oP '\|\K[^|]+(?=\|)' ip.txt | awk '!seen[$0]++'
yoo
dummy
yes
wow
hub
lab
short
hello
good-guy
bad-girl
lol
a4-123
b4-124
Respuesta2
Si no le importa el orden, puede utilizar un hash de Perl para garantizar la unicidad, por ejemplo
$ perl -lne '$h{$_}++ for /(?<=\|).*?(?=\|)/g; END{print for keys %h}' file
short
b4-124
lol
yes
bad-girl
lab
yoo
good-guy
hub
dummy
hello
a4-123
wow
Vercreando un hash con coincidencias de expresiones regulares en perl
Respuesta3
¿Qué pasa con lo siguiente?
cut file -d'|' -f2,3,4 | tr '|' '\n'
El comando anterior imprimirá un número fijo de columnas (3). Si desea imprimir un número variable de columnas, hasta la primera aparición de /
, puede usar algo como:
cut -d'/' -f1 file | cut -d'|' -f2- | tr '|' '\n'
Respuesta4
Su salida tiene repeticiones "ficticias". Esto es lo que obtengo con el siguiente script:
awk -f f1.awk /tmp/f1
short
hub
wow
hello
a4-123
b4-124
yes
yoo
lol
bad-girl
good-guy
lab
dummy
cat f1.awk
{
n=split($1,a,"|")
for(i=2; i<n; i++) {
arr[a[i]] = a[i]
}
}
END{
for (var in arr)
print(var)
}