reemplazar - sed linux
¿Debo usar cut o awk para extraer campos y subcadenas de campo? (4)
Tengo un archivo con campos separados por tubería. Quiero imprimir un subconjunto del campo 1 y todo el campo 2:
cat tmpfile.txt
# 10 chars.|variable length num|text
ABCDEFGHIJ|99|U|HOMEWORK
JIDVESDFXW|8|C|CHORES
DDFEXFEWEW|73|B|AFTER-HOURS
Me gustaría que el resultado fuera así:
# 6 chars.|variable length num
ABCDEF|99
JIDVES|8
DDFEXF|73
Sé cómo obtener los campos 1 y 2:
cat tmpfile.txt | awk ''{FS="|"} {print $1"|"$2}''
Y sepa cómo obtener los primeros 6 caracteres del campo 1:
cat tmpfile.txt | cut -c 1-6
Sé que esto es bastante simple, pero no puedo entender cómo combinar los comandos awk
y cut
.
Cualquier sugerencia sería muy apreciada.
Me gusta una combinación de corte y sed, pero eso es solo una preferencia:
cut -f1-2 -d"|" tmpfile.txt|sed ''s//([A-Z]/{6/}/)[A-Z]/{4/}//1/g''
Resultado:
# 10-digits|variable length num
ABCDEF|99
JIDVES|8
DDFEXF|73
Editar: (Se quitó el gato inútil) ¡Gracias!
Podrías usar awk
. Use la función substr()
para recortar el primer campo:
awk -F''|'' ''{print substr($1,1,6),$2}'' OFS=''|'' inputfile
Para su entrada, produciría:
ABCDEF|99
JIDVES|8
DDFEXF|73
Usando sed
, podrías decir:
sed -r ''s/^(.{6})[^|]*([|][^|]*).*//1/2/'' inputfile
para producir el mismo resultado
Solo para otra variación: awk -F/| -vOFS=/| ''{print $1,$2}'' t.in | cut -c 1-6,11-
awk -F/| -vOFS=/| ''{print $1,$2}'' t.in | cut -c 1-6,11-
Además, como señala tripleee, dos cortes también pueden hacer esto: cut -c 1-6,11- t.in | cut -d/| -f 1,2
cut -c 1-6,11- t.in | cut -d/| -f 1,2
Podría usar cortar y pegar, pero luego debe leer el archivo dos veces, lo cual es un gran problema si el archivo es muy grande:
paste -d ''|'' <(cut -c 1-6 tmpfile.txt ) <(cut -d ''|'' -f2 tmpfile.txt )