Skip to content

Latest commit

 

History

History
2657 lines (2042 loc) · 67.7 KB

operaciones-logicas-datos.org

File metadata and controls

2657 lines (2042 loc) · 67.7 KB

Operaciones lógicas con datos

Necesidades previas

  • Disponer de un ordenador con sistema operativo sobre el que tengamos permisos de superusuario/administración.
  • Preferiblemente, GNU/Linux. Si no lo tienes, igual es un buen momento para instalártelo.
  • Manejo del entorno de escritorio.
  • Instalación y desinstalación de programas.
  • Resolución de problemas.
  • Conocimiento del árbol de directorios. Rutas y enlaces simbólicos
  • Manejo de versiones de archivos.

Fundamental

  • Conocimiento de la arquitectura hardware del ordenador.
  • Conocimiento de la estructura del sistema operativo.
  • Uso de la terminal, consola Unix.
  • Manejar la estructura de ficheros.
  • Distinguir entre rutas absolutas y relativas.
  • Nociones de las distintas codificaciones de caracteres.
  • Qué tipos de datos hay
  • Qué tipos de formatos de datos hay.
  • Usuarios y grupos, permisos
  • Espíritu crítico.
  • Ganas de aprender.

Opcional

  • Atajos de teclado.
  • Conocer la Web: navegador, lenguaje HTML, programas, utilidades, atajos, buscadores.
  • Git, git*,
  • Nociones de periodismo de datos: investigación, datos y visualización.

Programación

¿De qué hablamos cuando nos referimos lxs periodistas a que no sabemos programar?

Lenguajes informáticos

  • Todos los lenguajes que utiliza un ordenador.
  • Lenguajes de programación: Python, R, Haskell, Lisp
  • Lenguajes de especificación, descripción o marcado: HTML, CSS, MD
  • Lenguajes de consulta: SQL, XQuery, SPARQL
  • Lenguajes de transformación: XSLT
  • Lenguajes de sonido
  • Lenguajes gráficos
  • Pseudocódigo

Lenguaje de programación

  • Lenguaje formal diseñado para realizar procesos que pueden ser llevados a cabo por máquinas como las computadoras.
  • Controlar el comportamiento físico y lógico de una máquina.
  • Formado por un conjunto de símbolos y reglas sintácticas y semánticas que definen su estructura y el significado de sus elementos y expresiones.

Estructura

Sujeto Predicado Objeto
Función Variable Argumento

Sintaxis de los comandos

Ejecución del comando sin más

Para ejecutar el comando sin más, por ejemplo, ls, escríbelo y pulsa Enter o retorno de carro

ls

Comando más argumentos

En el caso de ls, podemos decirle que nos liste un archivo concreto, por ejemplo:

ls alumnxs.org

Otros comandos pueden requerir uno o más argumentos.

Comando con opciones

  • Cada comando tiene múltiples opciones, y se pueden combinar.
  • Las opciones se suelen escribir con una sigla que corresponde con una palabra, separado por un guión.
  • Por ejemplo, si escribimos ls -r, listamos el directorio en orden inverso.
ls -r

Nótese la diferencia con la ejecución anterior.

Tipos de datos

  • Números enteros o integers
  • Decimales, flotantes o floats
  • Cadenas -de caracteres- o strings
  • Booleanos: verdades o falso
  • Otros objetos

Algunos símbolos

  • \n, línea nueva
  • \b, backspace
  • \r, retorno de carro.
  • \t, tabulador
  • \f, formfeed
  • \e, espacio
  • \\, barra invertida
  • \", comillas
  • \000, carácter octal.

Herramientas básicas

Emacs

  • Se puede descargar y utilizar tanto en Linux, Windows o

Mac. Podemos descargarlo desde:

Cygwin

Hemos de hacer 3 pasos:

  1. Instalar los paquetes con los que queremos trabajar.
  2. Configurar para que no sea vi el editor por defecto.
  3. Cambiar la variable db_home

Instalar paquetes

  • La consola viene con un conjunto de paquetes básicos.
  • Para usar más paquetes, en el momento de la instalación del setup, tenemos que elegir los paquetes.
  • Ojo, cuando queramos instalar otro paquete, tendremos que hacer lo mismo, volver a correr setup
  • Algunos paquetes para trabajar con datos:
    • git, para trabajar con git, software de control de versiones.
    • imagemagick, para manipular imágenes.
    • emacs, para editor de texto.
    • python, para trabajar con Python.
    • R, para trabajar con R.
    • perl, para trabajar con perl.
    • ruby, para trabajar con ruby.
    • tesseract, herramienta de reconocimiento óptico de caracteres (OCR), con los paquetes en inglés y español dado que son los idiomas más habituales.
    • grep, para realizar búsquedas en el texto.
    • pdfgrep: para realizar búsquedas en texto de pdfs.
    • sgrep, para realizar búsquedas de texto en documentos SGML, XML o HTML.
    • gawk, para procesar texto.
    • sed, para editar flujos de texto.
    • qpdf, para transformación de PDF
    • xpdf, para visionar y otras operaciones con pdf
    • odt2txt, para pasar un odt a txt.
    • xlsx2csv, para pasar un xlsx a csv.
    • p7zip, archivar y comprimir datos.
    • gzip, compresor de datos
    • unzip, descompresor de datos
    • zip, compresor de datos
    • lynx, visor web
    • links, visor web
    • curl, transferencia de archivos multiprotocolo
    • wget, descargar archivos de la web
    • less, paginador, similar a more
    • vim, editor de textos

Configuración de editor por defecto

  • Cuando editamos un archivo de configuración, por ejemplo de git, el programa que utiliza por defecto es vi, complicado pero no imposible (manual en inglés y español).
  • Si os mola el rollo vi, sería mejor instalar vim (manual).
  • Propongo modificarlo por emacs, que además comparte atajos con la terminal. (reference card y cheat sheet… con orgmode, un plus!)

Para ello, editaremos desde nuestro editor favorito, el archivo .bashrc del directorio de Cygwin y pondremos:

export VISUAL=emacs
export EDITOR="$VISUAL"

Cambiar la home de Cygwin

  • Por defecto, la home del usuarix de Cygwin es el directorio de instalación del programa.
  • Para disfrutar de Cygwin y acceder a todo el disco, debemos modificar la variable db_home en /etc/nsswitch.conf

Escribimos:

db_home: windows

O de forma equivalente:

db_home: /%H

De esta última manera puedes interpretar el esquema y hacer que estén dentro del subdirectorio cygwin, por ejemplo:

db_home: /%H/cygwin

En esta página proponen otro método:

mkpasswd -l -p "$(cygpath -H)" > /etc/passwd

Markdown

Línea de comandos

  • La línea de comandos es una interfaz de usuarix basada en líneas de

comandos (Command Line Interface o CLI).

  • Cuando utilizamos un ordenador, tenemos interfaces para utilizar los

programas.

Qué son las Interfaces de usuarix

En la actualidad, cuando utilizamos un ordenador personal –de forma general–, usamos interfaces gráficas de usuarix GUI (Graphic User Interface).

Pero también podemos, de forma general o específica, utilizar otras interfaces como son:

  • Las referidas CLI
  • Las NUI (Natural User Interface o

interfaz natural de usuarix), como pueden ser las pantallas capacitivas multitáctiles, Kinect –con el movimiento– o Siri –con el reconocimiento de lenguaje natural– .

Historia

Al inicio de los ordenadores, solo había líneas de comandos para comunicarnos con ellos. Bell Telephone lanzó en 1969 V1 sobre UNIX Timeshare System. UNIX tenía la shell sh que era la única forma de comunicarse con el ordenador.

Así fue hasta 1973, cuando Las GUI fueron desarrollados en el Centro de Investigación de Xerox en Palo Alto (Palo Alto Research Center, PARC).

Tiempo después, Apple pagó para estudiar la idea, que finalmente se concreto en su GUI.

El MIT desarrolla una GUI para Unix en 1986, X.

El sistema XFree86 de Linux se desarrolló en 1996, una implementación libre del original X, al que homenajea en el nombre.

Ventajas de la línea de comandos

  • Ahorras tiempo
  • Te ofrecen una alternativa a las GUI.
  • Te acercan más a cómo funcionan los sistemas POSIX.
  • Funcionas con atajos compartidos.
  • Te preparan para la programación.
  • Aprendes otra forma de hacer las cosas.
  • Te empodera.

Conceptos

  • Utilizaremos un emulador de terminal, dado que estamos en un entorno gráfico.
  • La terminal es la interfaz más directa con el sistema operativo.
  • Una shell es un intérprete de comandos de la terminal.
  • Un comando u orden es una utilidad que ejecutas en la shell.
  • La salida es lo que devueve el comando, normalmente en la terminal, llamada STDOUT por STandarD OUTput o salida estándar.
  • La entrada de datos, argumentos o comandos es lo que se conoce como STDIN por STandarD INput.
  • Un proceso es una aplicación que corre (está ejecutada, funciona) en tu ordenador. Puede estar activa o durmiendo.

Atajos de consola

  • C-l, limpia la consola, es lo mismo que darle a clear
  • C-a, ir al inicio de la línea
  • C-e, ir al final de línea.
  • C-u, limpia la línea desde el inicio de la línea hasta la posición actual.
  • C-c, para el proceso.
  • C-S-c, copia el texto seleccionado.
  • C-S-v, pega el texto seleccionado.
  • C-z, para el proceso.
  • C-d, en una línea en blanco, es igual que exit. Si tiene texto, borra un carácter.
  • C-k, borra de la posición del cursor al final de la línea.
  • C-b, mueve el cursor un carácter hacia atrás.
  • M-b, mueve el cursor una palabra para atrás.
  • C-f, mueve el cursor un carácter hacia delante.
  • M-f, mueve el cursor una palabra hacia delante.
  • C-h, borra la letra antes del cursor.
  • C-w, borra la palabra antes del cursor.
  • C-p, sube una línea, es decir, ve el último comando realizado.
  • C-n, bajar una línea o ir al comando siguiente.

Scrolls through the commands you’ve entered previously. Takes you back to a more recent command. Enter When you have the command you want. tab A very useful feature. It autocompletes any commands or filenames, if there’s only one option, or else gives you a list of options. Ctrl + R Searches for commands you’ve already typed. When you have entered a very long, complex command and need to repeat it, using this key combination and then typing a portion of the command will search through your command history. When you find it, simply press Enter. The history command shows a very long list of commands that you have typed. Each command is displayed next to History a number. You can type !x to execute a previously typed command from the list (replace the X with a number). If you history output is too long, then use history | less for a scrollable list. Example: you ran history and found you want to use command 1967. Simply enter !1967

Explorador de archivos

ls

Lista los archivos del punto en el que nos encontramos. Viene del inglés list. Si lo lanzamos sin argumentos, obtendremos un listado de los archivos y directorios que contiene ese directorio:

ls

ls [opciones] lista los archivos del punto en el que nos encontramos.

  • -a, lista todos los archivos.
  • -l, lista en formato largo

Para emplear argumentos, utilizaremos la estructura:

ls -a

Si queremos saber la información de cada archivo y directorio, lo haremos con la opción -l:

ls -l

pwd

  • pwd es el acrónimo de print working directory o muestra por pantalla el directorio de trabajo actual.
  • Es decir, imprime la ruta absoluta del sistema donde nos encontramos.
pwd

mkdir

  • Para crear un directorio, usamos mkdir, make directory
  • mkdir [opciones] [nombre-directorio]

cd

  • Con cd cambiamos de directorio
  • Viene de las iniciales del inglés change directory.
  • Si escribimos solo cd, vamos a nuestro espacio home definido en la variable de entorno HOME.

Para cambiar de directorio, podemos elegir la ruta absoluta o la relativa.

cd [ruta]

Atajos de rutas

  • cd, vamos a la home del usuario
  • cd ., vamos al directorio en el que estamos.
  • cd .., vamos al directorio superior
  • cd ~, vamos al directorio home del usuario.
  • cd -, vamos al directorio donde estábamos antes.

Con esos atajos también podemos construir rutas, por ejemplo, con cd ~/Documentos vamos al directorio Documentos del usuario con el que estamos (en un ordenador con GNU/Linux)

cd [ruta], change directory, cambia al directorio elegido. Podemos escribir la ruta absoluta o bien con atajos:

  • cd, vamos a la home del usuario
  • cd ., vamos al directorio en el que estamos.
  • cd .., vamos al directorio superior
  • cd ~, vamos al directorio home del usuario.

Con esos atajos también podemos construir rutas, por ejemplo, con cd ~/Documentos vamos al directorio Documentos del usuario con el que estamos.

env

  • Podemos saber las variables que manejamos con el comando env
  • Si dirigimos la salida al filtrado con grep de la palabra HOME o home

Luego explicaremos lo que hacemos aquí:

env | grep HOME

touch

Con touch [archivo], creamos archivo vacío, lo mismo que con mkdir creamos un directorio.

cp

Con cp copiamos archivos y/o directorios.

cp [opciones] [origen] [destino]
  • Con cp -r copia los directorios recursivamente
  • Si queremos copiar varios archivos/directorios en un directorio, el último que ponemos es el destino.

mv

Con mv un archivo o directorio completo. También sirve para renombrar, aunque para esto tenemos a rename.

mv [origen] [destino]

Entrada Salida I/O, control del flujo

https://upload.wikimedia.org/wikipedia/commons/7/70/Stdstreams-notitle.svg

POSIX

Para saber de los procesos de entrada y salida de datos, conviene saber de POSIX. ¿Qué es POSIX? Es lo que hace diferente Unix de Windows, es lo que te complica o te facilita la vida si quieres una compatibilidad en las operaciones que puedes hacer a nivel de sistema operativo.

Qué es POSIX

POSIX es el acrónimo de Portable Operating System Interface (Interfaz de Sistema Operativo Portable), y la X viene de UNIX como seña de identidad de la API.

Como anécdota, decir que el nombre fue sugerido por Richard Stallman, fundador del proyecto GNU, cuando en 1980 pertenecía al comité del IEEE (Institute of Electrical and Electronics Engineers, Instituto de Ingenierxs Electrónicxs y Eléctricxs) que desarrolló el protocolo finalmente conocido como POSIX.

Estándares

Se trata de una familia de estándares que pretenden mantener la compatibilidad entre sistemas operativos. POSIX define la API, así como la línea de comandos y otras interfaces necesarias.

3 archivos

Cada proceso en estos entornos suele disponer de tres archivos abiertos al comienzo de su ejecución:

  1. La entrada
  2. La salida
  3. La salida de errores.

Descriptores de archivos

El hecho de ser estándares es porque suelen estar asignados a descriptores de archivos conocidos, de manera que un programa:

  • Siempre tomará los datos de entrada por el descriptor cero 0.
  • Enviará los resultados por el descriptor uno 1.
  • Mostrará los errores por el descriptor dos 2.

STDIN, STDOUT, STDERR

Para referirnos a ellos, se les denomina:

  1. La entrada, STDIN (STanDard INput, entrada estándar).
  2. La salida, STDOUT (STanDard OUTput, salida estándar).
  3. La salida de errores, STDERR (STanDard ERRor, salida estándar de errores).

La terminal

Esta convención no tiene mucho sentido en sistemas gráficos o en programas que funcionan con demonios, pero alcanzan todo su potencial con la terminal.

La terminal o emulador de terminal es el programa que nos conecta con la shell del sistema, el intérprete de comandos del sistema operativo.

Entrada y salida de datos

  • La entrada de datos suele ser el teclado
  • La salida típica suele ser la pantalla
  • La salida de errores suele suplir a la salida típica, en caso de que se produzcan errores en la ejecución del comando.

Modificación de los procesos

Estos procesos se pueden modificar:

  • Podemos redirigir la salida a un archivo.
  • O bien dirigir la entrada a un comando.
  • O redirigir una salida a una entrada.

Redirección de STDOUT y STDERR

Quienes trabajáis habitualmente con Github, quizás os suene cuando creáis un repositorio nuevo que entre las opciones para hacerlo, dice:

...or create a new repository on the command line
echo "# prueba-borrar" >> README.md

Lo que aquí proponen es utilizar el comando echo, que como su nombre indica nos devuelve lo que le digamos, y dirigir la salida a un archivo.

echo

Si escribimos echo hola, la salida del comando por la salida típica, que es la pantalla, será hola:

echo "hola"

echo y STDOUT a un archivo

Com proponían en Github, si le decimos a echo que devuelva hola pero queremos incluirlo en un archivo de nombre README.md, haremos:

echo hola > README.md

STDOUT a un archivo

Como escribíamos en el ejemplo anterior, el carácter > redirecciona la salida típica o STDOUT al archivo README.md.

¿Lo crea? ¿Lo destruye?

  • Si no existía ese archivo, efectivamente, lo crea con hola como

contenido.

  • Si existía, lo sobreescribe con hola como contenido.

STDOUT a un archivo sin sobreescritura

Si no queremos sobreescribirlo, porque ya existía, sino añadir contenido a ese archivo, en vez de > utilizaremos >>:

Como ya he creado con el ejemplo anterior el archivo README.md con el contenido hola, ahora voy a añadir ¿qué tal:

echo qué tal >> README.md

Para comprobarlo, hacemos un more:

more README.md

Atención

Aunque aquí no hemos usado comillas, es recomendable introducir el texto entre comillas, así nos evitamos que haya palabras reservadas que empleemos en la frase:

echo "pues muy bien, gracias" >> README.md

Así añadiremos una tercera línea a README.md con ese texto.

Repaso de STDOUT

En io-redirection, hacen un buen repaso:

Redirección de STDOUT a archivo, donde lo crea o lo sobreescribe:

comando 1> archivo

Redirección y añadido de STDOUT a archivo:

comando 1>> archivo

Repaso de STDERR

Redirección de STDERR a archivo:

comando 2> archivo

Redirección de STDERR y se añade al final del archivo:

comando 2>> archivo

Redirección de STDOUT y STDERR a archivo:

comando &> archivo

Redirección de STDIN

En sentido contrario a STDOUT, podemos hacer que un comando ejecute un archivo ya creado:

comando < archivo

Redirección STDOUT a un comando

Para redirigir un comando con otro utilizamos el carácter de barra vertical | que representa la tubería: entubar/dirigir un comando a otros.

comando1 | comando2 | comando3

Comodines

Los comodines permiten usar valores conocidos con valores comodín.

Hay tres operadores:

  • *, para cualquier número de caracteres.
  • ?, para un carácter.
  • [x-y], para un rango.

*

Podemos listar todos los csv con el comodín *, ya que puede haber archivos con un carácter o varios.

ls *.csv

De esta manera listaremos todos los archivos csv, pero también #+BEGIN_SRC sh :output org ls *.csv

?

El comodín ? sirve para solo un carácter, cualesquiera. Por ejemplo, si tuviéramos archivos que solo difieren en un carácter, podemos listar ambos.

Imaginemos que tenemos archivos 1.pdf, 2.pdf, 3.pdf, etc. Podríamos listarlos con el comodín ?:

ls ?.pdf

[]

El comodín corchetes cuadrados o [] permite buscar rangos de números o letras.

si queremos buscar en el csv tanto CLESA como BLESA, podemos escribir:

grep [B-C]LESA black-is-black.csv | wc -l

Procesos

  • top, sirve para ver qué procesos consumen más.
  • ps [comando] informa de los procesos de ese comando.
    • ps -f, lista completa
    • ps -e, muestra todos los procesos
    • ps aux | grep [comando], muestra los procesos de ese comando
  • comando &, corre proceso por detrás, en el background.
  • jobs, muestra procesos que corren por detrás
  • kill señal numero-proceso, manda la señal determinada a ese proceso
  • killall comando, mata todos los procesos de ese comando

Permisos

  • Los archivos/directorios pertenecen al usuario, del grupo y de otros
  • Las opciones de cada cual son lectura r read, escritura w write y ejecución x execute
  • u, por user, usuario
  • g, por group, grupo
  • o, por others, otros
  • a, por all, todos

chmod

Literalmente, change mode (cambia el modo) para un archivo o directorio. La estructura es chmod [opciones] [modo] [destino]

Establecer permisos

Si queremos poner un tipo de permisos, podemos hacerlo con el operador ===

chmod a=rx *

De esta forma pondremos permisos de escritura y ejecución para todos, y quitaremos los de escritura si los tenía, a todos los archivos y directorios del directorio.

Dar permisos

Para dar permisos de escritura y ejecución a todos los archivos y subdirectorios por debajo de ese directorio:

chmod +rx *

Quitar permisos

Si con + damos permisos, con - quitamos:

chmod g-w .

Quita los permisos de escritura al grupo en el directorio en el que nos encontramos.

Otra forma de establecer permisos

Otra forma de otorgar permisos es con la relación numérica. Dado que tenemos tres tipos de usuarios y tres tipos de permisos, se puede crear una matriz con los permisos:

rwx rwx rwx = 111 111 111
rw- rw- rw- = 110 110 110
rwx --- --- = 111 000 000

Lo que significa:

rwx = 111 en binario = 7
rw- = 110 en binario = 6
r-x = 101 en binario = 5
r-- = 100 en binario = 4

Por tanto, el valor se corresponde con:

rwx rwx rwx = 321 321 321
rw- rw- rw- = 320 320 320
rwx --- --- = 321 000 000

Así, si quisieramos dar todos los permisos al archivo hola.txt, haríamos:

chmod 777 hola.txt

Configuración de la terminal

En la propia terminal tienes opciones de perfiles de color que puedes usar o variables:

Variables de entorno

Especifica las variables que se exportan a todos los procesos que son reproducidos por el shell.

Se utiliza el comando export para exportar una variable:

export VARIABLE=value

Para comprobar las variables, lanzaremos el comando env:

env

Aspecto de bash

Si quieres cambiar el aspecto del bash y que no aparezca todo el chorro de carpetas en las que te encuentras y que convierte tu línea en algo difícil de utilizar, cámbialo:

#PS1='[\u@\h \W]\$ '  # Default
PS1='\[\e[1;31m\][\u@\h \W]\$\[\e[0m\] '

Ahí elegimos, en el primer subcorchete, el color (ver la lista de colores completa), como por ejemplo \e[1;31m, color rojo y en negrita o bldred.

El primer número se refiere a que sea texto normal, en cursiva, en negrita o subrayado.

  • 1, para que aparezca en negrita
  • 2, aparece normal
  • 3, aparece en cursiva
  • 4, para que aparezca subrayado

Si queremos probarlo en la terminal, podemos utilizar el comando echo:

echo -e "${txtblu}test"

Cómo escapar caracteres en prompt

Se puede ver el listado de caracteres que escapan.

En este caso, en el segundo subcorchete definimos:

  • Con \u, que aparecerá el nombre del usuarix.
  • Con @ que aparecerá una arroba
  • Con \h que aparecerá el nombre del host.
  • \W indica que se pondrá el directorio de trabajo relativo o current relative path, si no estás en ~/. Si quisiéramos la ruta absoluta emplearíamos \w

Autocompletado

Probablemente tengamos activada en la terminal la opción autocompletado, que podemos ver con estas líneas o parecidas en el archivo .bashrc:

# enable programmable completion features (you don't need to enable
# this, if it's already enabled in /etc/bash.bashrc and /etc/profile
# sources /etc/bash.bashrc).
if ! shopt -oq posix; then
  if [ -f /usr/share/bash-completion/bash_completion ]; then
    . /usr/share/bash-completion/bash_completion
  elif [ -f /etc/bash_completion ]; then
    . /etc/bash_completion
  fi
fi

Por tanto, podríamos pulsar dos veces el tabulador cuando empecemos a escribir un comando y la terminal autocompletará.

Comandos y ayuda

La estructura al ejecutar en la mando siempre es la misma:

nombre-de-comando opciones argumentos

Si queremos saber qué hace un comando, hay tres opciones, dos comandos que aportan información sobre los otros comandos y una opción de cada comando: whatis, --help y man.

Whatis

whatis muestra un par de líneas a lo sumo sobre el comando, de la información que aparece en el manual.

Por ejemplo, si queremos saber qué hace el comando wc, haremos whatis wc:

whatis wc

La ayuda suele estar en inglés.

Help

Sobre cualquier comando, con la opción --help nos muestra una versión reducida del manual:

wc --help

Man

El comando man con el nombre del comando como argumento del que se quiere saber nos abre el paginador del manual del comando, normalmente el comando more.

Para avanzar en el paginador, hay que darle a la barra espaciadora y para salir del paginador sin llegar al final, hay que pulsar la tecla q.

Si quieres ver el manual de wc, escribirimos:

man wc

Algunas utilidades

Interrumpir un comando

Para interrrumpir el curso de un comando, se puede pulsar a la vez las teclas de Ctrl y c.

Ctrl + c

Para que esto no suponga un lío, lo habitual es presionar primero la letra Ctrl y, sin soltarla, pulsar c una vez. Luego soltar en orden inverso, primero la c y luego Ctrl.

Limpiar la línea

Para limpiar la línea con algo que hemos escrito y podríamos borrar con la tecla de Backspace, podríamos pulsar la combinación de teclas Ctrl + u.

Ctrl + u

Salir de la terminal

Se puede salir de la sesión con el comando exit o con la combinación de teclas Ctrl más d.

Screen

Con el comando screen podemos abrir una terminal virtual dentro de la sesión, de tal forma que podemos ejecutar comandos en segundo plan o, como por ejemplo un ping, una descarga de un fichero con curl (ver más adelante) o cualquier otra orden o conjunto de órdenes.

Para lanzarlo, escribimos screen y entonces pide que continuemos con space o salgamos con return.

Una vez que hemos continuado con space, podemos lanzar el comando que queramos tener en segundo plano, como por ejemplo, ping. Para dejarlo en segundo plano, se teclea Ctrl + a + d.

Ctrl + a + d

Si queremos saber los comandos que tenemos en segundo plano, se pueden ver con screen -ls.

Si solo tenemos un screen lanzado, podremos volver con screen -r, pero si tenemos varios, que se mostrarán con screen -ls, podremos volver al que nos interese con screen -r más el número que nos aparece en el listado.

Para cerrar la terminal virtual se utiliza también el comando exit.

Aliases

Se pueden hacer alias de los comandos e incluirlos en .bashrc. Por ejemplo:

Un alias de ls para que siempre que lo invoquemos haga ls -aF --color:

alias ls='ls -aF --color=always'

O un comando nuevo, por ejemplo ll, que lanza ls -l:

alias ll='ls -l'

Podemos renombrar un comando, como por ejemplo que grep sea search:

alias search=grep

O que al escribir .. subamos un directorio con cd ../:

alias ..='cd ../'

Utilidades

history

  • history muestra los comandos usados.
  • Esta lista se encuentra en el archivo (oculto) .bash_history
  • history -c limpia la historia
  • history |grep [comando], muestra la historia de ese comando
  • Si la línea 2001 es la del comando que queremos utilizar, podemos escribir !2001

Búsqueda recursiva

  • Podemos utilizar uno de los comandos anteriores haciendo una búsqueda recursiva con CTRL + r
  • Inmediatamente después ponemos el comando que queramos utilizar.
  • La primera opción será la última que utilizamos con ese comando o más bien con esa cadena de caracteres en la ejecución de cualquier comando.
  • Es decir, la búsqueda no solo la hace sobre el comando utilizado sino también sobre cualquier texto de .bash_history.
  • Si la primera búsqueda no nos gusta, podemos seguir escribiendo para ser más concretos.
  • Si eso no nos devuelve lo deseado, también podemos volver a teclear CTRL + r para ir hacia las búsquedas similares que hubo más atrás.

time

time [comando], muestra el tiempo de ejecución del comando, es decir, el tiempo que tarda en ejecutarse.

diff

diff compara archivos línea por línea.

Explorar el archivo

wc

Lo primero que nos podemos preguntar cuando nos enfrentamos a un archivo es saber cuánto pesa, cuántas palabras tiene y, si se trata de un CSV, cuántas líneas tiene.

Para ello utilizamos wc, que responde a word count, contar palabras, y es de mucha utilidad tanto por separado como en combinación con otros comandos.

El esquema de uso sería:

wc [opciones] archivo

Opciones

Algunas opciones son:

  • -l, cuenta líneas
  • -c, cuenta bytes
  • -m, cuenta carácteres
  • -w, cuenta palabras

Ejemplo

¿Cuántas líneas, palabras y bytes tiene el archivo 155-colegios-publicos-valencia-amianto.csv

wc data/155-colegios-publicos-valencia-amianto.csv

Lo cual nos da las líneas, palabras y bytes que tiene:

156  764 5253 

Contar el número de líneas de un archivo

Si queremos contar solo las líneas, lo haremos con la opción -l:

wc -l data/155-colegios-publicos-valencia-amianto.csv

Lo cual como resultado, 156.

Contar el número de palabras

Lo mismo haríamos con las palabras pero esta vez con la opción -w en vez de -l:

wc -w data/155-colegios-publicos-valencia-amianto.csv

Con lo que obtenemos 764

Contar el número de caracteres

Cuando queremos saber el número de caracteres, la opción es -m

wc -m data/155-colegios-publicos-valencia-amianto.csv

5119 caracteres en total, un número lígeramente inferior a los 5253 bytes que tiene el archivo.

Contar líneas

Si queremos contar solo las líneas, lo haremos con la opción -l:

wc -l rera_aragon.csv

Saber el tamaño (contar los bytes)

wc -c rera_aragon.csv

Contar las palabras

wc -w rera_aragon.csv

Contar número de caracteres

wc -m rera_aragon.csv

du

El número de bytes está bien saberlo, pero igual queremos una lectura a la que estemos más acostumbradxs, como por ejemplo, en Kilobytes o Megabytes.

Para ello podemos utilizar du, que resume el espacio en disco de un archivo, directorio o conjunto de directorios.

Para obtener esos datos en un formato de lectura comprensible, utilizamos la opción -h

Otra opción interesante es -s, que hace un resumen.

Así, si queremos saber cuánto pesa el directorio en el que nos encontramos, escribiremos:

du -sh .

head

Ahora que ya sabemos cuánto pesa y qué caracteres o palabras tiene el archivo, igual nos interesa echar un vistazo al archivo.

Esto lo podemos hacer con varios comandos. Uno de ellos es head, que muestra las diez primeras líneas de un archivo.

head data/155.csv

Ahí vemos:

  • Que la primera línea es la cabecera de la tabla
  • Que tiene dos columnas
  • Aunque parece que la segunda está vacía, luego puede significar que no se han pasado los datos que correspondían a esa columna.

head con otro número de líneas

Si queremos un número de líneas distintas, tan solo tenemos que ponerlo como opción antes del argumento del comando.

Por ejemplo, si solo queremos 4 líneas:

head -4 data/155.csv

tail

Si head nos muestra las primeras líneas de un archivo, el comando tail muestra las últimas.

tail data/155.csv

tail modificar nº%% líneas

Y también podemos modificar el número de líneas que salen especificándolo antes del argumento con la opción -n o directamente con el número de líneas como opción:

Por ejemplo, si queremos las dos últimas líneas:

tail -2 data/155.csv
tail -n2 data/155.csv

cat

Podemos ver todo el archivo con cat, que es un comando que sirve para concatenar archivos y que veremos luego, pero que de forma simple nos muestra por la salida estándar todo el archivo.

Si es muy largo, no vamos a ver más que las últimas líneas, las que quepan en la pantalla, ya que no se va a detener hasta el final.

cat data/155.csv

Por eso se suelen utilizar paginadores, que son como lectores para documentos de texto. Los más empleados son more y less.

more

  • Con more vemos un archivo de texto paginado.
  • Podemos hacer búsquedas.
  • Cuando queramos parar, podemos pulsar q.

head y tail

Vistos estos dos comandos, head y tail, se pueden combinar para que la salida de uno sirva como entrada de otro, y de esta manera, saber qué contiene una línea en concreto.

La concatenación de comandos lo hacemos con la tubería |. La tubería o pipe sirve para pasar la ejecución de un comando a otro.

Línea nº 30

Si quisiéramos saber el contenido de la línea número treinta del fichero, mostraríamos las 30 primeras líneas con head -30 y lo concatenaríamos con tail -1 para saber la última de esas 30 primeras líneas:

head -30 data/155.csv | tail -1

De esta manera podemos acceder, por ejemplo, a las filas 30 a 40:

head -40 data/155.csv | tail -10

grep

Son un conjunto de comandos que buscan patrones en el texto de los archivos: grep, egrep, fgrep, rgrep.

El comando grep responde a global regular expresion print, es decir, imprime el resultado de una expresión regular global. Sirve para buscar archivos que respondan a la cadena o string que aportemos.

Empieza por la primera línea del archivo, donde grep copia una línea en un buffer, lo compara contra la cadena de búsqueda y si la comparación pasa, imprime la línea en pantalla.

grep repetirá este proceso hasta que el archivo recorra todas las líneas.

Nótese que en este proces, grep no almacena ni cambia las líneas ni tampoco busca una sola parte de la línea. Por ejemplo, si queremos buscar Elx, que hemos visto que es una localidad que aparece en el conjutno de datos que estamos explorando, lo haremos con el texto entre comillas, y nos mostrará los resultados:

grep "Oriola" data/155.csv

No tenemos que ponerlo entre comillas pero así nos aseguramos que lo lea mejor

Búsqueda con regexp

Si nos interesaran los números que aparecen en estos datos, podríamos hacer una búsqueda de cuántas líneas contienen números:

grep [0-9] data/155.csv

Contar los resultados de la búsqueda con grep

Para contar esos resultados, le añadimos la opción -c

grep -c "Elx" data/155.csv

Número de línea

Si queremos que salga el número de línea donde aparece la expresión buscada, podemos hacerlo con la opción -n:

grep -n "Santa Pola" data/155.csv

Opciones de búsqueda con OR

Para dar opciones de búsqueda, operador lógico OR, caben varias opciones a utilizar:

  • El operador lógico \|
  • Utilizar la combinación | pero con la opción -E
  • egrep
  • grep con -e y -e

OR con \|

grep "Santa Pola\|Oriola" data/155.csv

Y para contarlo, lo mismo que antes:

grep -c "Santa Pola\|Oriola" data/155.csv

OR con | y -E

Añadimos c a las opciones para que no salgan los resultados sino que los cuente.

grep -cE "Alacant|Elx" data/155.csv

egrep

egrep es lo mismo que grep -E. Añadimos la opción c para que muestre las veces que aparece.

egrep -c "Alacant|Elx" data/155.csv

grep -e -e

Lo mismo pero cada vez que filtramos ponemos la palabra tras la opción e y al final, c.

grep -e "Elx" -e "Alacant" data/155.csv -c

grep AND

Aunque no hay operador AND en grep, podemos hacerlo de varias maneras:

  • Con la opción -E y separando las cadenas con .*:
  • Encadenando grep

grep AND -E .*

grep -E "Elx.* CP" data/155.csv

Nos dará por la salida estándar cuántos colegios públicos de Elx hay.

grep AND -E |

grep -E "Elx" data/155.csv | grep -Ec "CP"

26 son los colegios públicos (CP) de Elx.

grep NOT

Con el uso de la opción -v se pueden simular condiciones NOT.

La opción -v es para búsquedas inversas, es decir, busca todas las líneas excepto las que cumplan este patrón. Por ejemplo:

grep -vEc "CP|IES" data/155.csv

31 centros no son ni CP ni IES.

Jugamos con combinaciones

Si queremos buscar los centros que no sean CP o IES de Elx y Oriola:

grep -vE "CP|IES" data/155.csv | grep -Ec "Elx|Oriola"

cut

Con cut extraemos secciones de un archivo, según las opciones:

  • c, para caracteres.
  • d, para delimitadores concretos.
  • z, para terminaciones.

Extraer por caracteres

Si quisiéramos extraer los primeros tres caracteres del archivo:

cut -c1-4 data/155.csv

Eso nos resolvería si el identificador de instalación fuera siempre del mismo número de caracteres.

Extraer por campos

Considerado un conjunto de datos con un delimitador, podemos identificar n campos.

En el caso que nos ocupa, dado que tenemos un espacio entre la identificación de la instalación y su nombre, podríamos seleccionar el primer campo de datos, el de identificación, si consideramos el espacio en blanco como delimitador.

cut -f 1 -d ' ' data/155.csv

Parece que hemos conseguido seleccionar algunos de los identificadores, independientemente del número de caracteres que contengan, por lo que vamos a guardar la selección en un archivo:

cut -f 1 -d ' ' data/155.csv > data/id-cut-c.csv

Y para verlos:

head -n5 data/id-cut-c.csv

Vemos que nos selecciona bien algunas líneas (CP, CEIP) pero otras no (Colegio). Esto es porque Colegio Público está escrito también como CP, por lo que podríamos reemplazar esa cadena por CP para que esta operación nos salga bien.

paste

Lo contrario que cut

fold

Breaks long input lines. The primary use is formatting, but fold is sometimes useful in linguistic text processing. For example, if you need to get each character onto a line by itself, the command

fold -w 1

, which sets the line length to one character, will do the job. GNU fold understands Unicode.

sed

Sed es un editor del flujo de datos que permite filtrar y transformar texto.

Cambiar una cadena de caracteres por otra

Si queremos unificar nuestro documento y que cuando aparece Colegio Público aparezca CP, hacemos:

sed 's/Colegio Público/CP/g' data/155.csv > data/155-sed-cp.csv

Como he enviado la salida a un archivo, no lo veo por aquí, Para explorarlo, voy a volver a ver como antes las 5 primeras líneas con head:

head -n5 data/155-sed-cp.csv

Ya no tenemos la cadena Colegio Público porque la hemos sustituido con sed por CP.

sed con regexp

Lo que hemos hecho antes ha sido utilizar sed con la opción regexp, es decir, expresiones regulares.

Con sed se utilizan de esta manera:

sed s/regexp/reemplazo/

Repasando el archivo con more también observo unas comillas que pueden molestar, que podríamos quitar con una nueva expresión regular:

sed 's/"//g' data/155-sed-cp.csv > data/155-sed-comillas.csv

Para seleccionar líneas con una cadena

sed -n '/Orio/p' data/155.csv

Cambia el orden de dos cadenas

sed -r 's/(cadena1)(cadena2)/\2\1/g

Separar por delimitador

Aunque no hay un delimitador, de datos en columnas, sí que hay un dato entre paréntesis, la localidad (en casi todos los casos).

Vamos a sacar el texto de los paréntesis:

cut -f 2 -d '(' data/155-sed-comillas.csv > data/155-cut-parentesis-2.csv

Y ahora borramos la parte final, que siempre es ), con sed:

sed 's/),//g' data/155-cut-parentesis-2.csv > data/155-sed-lugar.csv && head -5 data/155-sed-lugar.csv

Y vamos a sacar el texto de antes de los paréntesis

cut -f 1 -d '(' data/155-sed-comillas.csv > data/155-cut-parentesis-1.csv && head -5 data/155-cut-parentesis-1.csv

Y ahora seleccionamos la primera cadena, el tipo de colegio, de la misma manera:

cut -f 1 -d ' ' data/155-cut-parentesis-1.csv > data/155-cut-parentesis-0.csv && head -5 data/155-cut-parentesis-0.csv

Hemos conseguido tres CSV con tres tipos de datos: tipo de colegio, nombre de colegio y localidad.

Reto

Pero además, en las localidades, en algunas aparece la pedanía, separada por un guión, por lo que podríamos operar igual, pero al no estar en todas las líneas, no funciona:

cut -f 2 -d '-' data/155-cut-parentesis-2.csv > data/155-cut-parentesis-3.csv && grep -n ')' data/155-cut-parentesis-3.csv

Eliminar línea

Dado que estoy limpiando los archivos, en este último quitaré la primera línea que como he visto antes contiene la cabecera del conjunto de datos, es decir:

head -1 data/155-sed-lugar.csv

La cabecera con Colegios en la primera columna y Localidad en la segunda no me estaba funcionando dado que todos los datos estaban en la primera columna.

Para eliminar esta fila, lo hacemos con la opción de sed '1d'.

sed '1d' data/155-sed-lugar.csv > data/155-sed-lugar-limpio.csv 

Comprobamos:

head -1 data/155-sed-lugar-limpio.csv

Eliminar línea en blanco

Si hubiera una o más líneas en blanco, podríamos eliminarlo con:

sed '/^$/d' data/155-sed-lugar-limpio.csv

Eliminación de signos

Si quisiéramos eliminar líneas que contengan algunos de los signos de comentar al inicio, como por ejemplo una almohadilla # en Perl, Python, Ruby o R, haremos:

sed '/ *#/d; /^$/d; / *\*/d' data/prueba-sed.txt > data/prueba-sed-post.txt

Lo malo de este ejemplo es si se han escrito comentarios de bloque y no de línea, pero no dejemos que ese supuesto arruine este ejemplo ;-)

Convertir un TSV a CSV

sed 's/"/\\\"/g; s/^/"/; s/$/"/; s/ctrl-V<TAB>/","/g;' origFile.tsv > newFile.csv

Concatenación de tres comandos

Otro ejemplo, concatenando tres comandos: head, tail y cut:

Ya hemos hecho la concatenación de dos comandos, como por ejemplo ver las líneas 15 a 20 con la combinación de head (cabecera) y tail (cola).

Primero sacamos los 20 primeras líneas y luego le decimos que de esas 20 primeras solo queremos las cinco últimas entubando los resultados del primer comando al segundo:

head -n20 data/155.csv | tail -n5

Si entubamos ese resultado a cut con la opción c1-4, obtenemos los primeros cuatro caracteres de las líneas 15-20 de 155.csv.

head -n20 data/155.csv | tail -n5 | cut -c1-4

split

El comando split viene muy bien cuando estamos trabajando con un fichero muy largo ya que permite dividrlo en varios.

Siguiendo con el ejemplo original, si quisiéramos dividir nuestro fichero de 155 líneas en archivos de 10 líneas, podríamos hacerlo con split, ofreciendo la posibilidad de nombrarlos de forma especial:

split -l 10 data/155.csv data/diez_  && ls -a data/diez*

Si quisiéramos saber cuántos archivos hay, tendríamos que entubar ese resultado por wc -l, que nos contaría el número de líneas:

split -l 10 data/155.csv data/diez_ && ls -l data/diez* |wc -l

Veamos el contenido del último archivo:

more data/diez_ap

Si quisiéramos darles una extensión, podríamos renombrarlos o bien utilizar en split la opción --additional-suffix=SUFFIX:

split -l 10 data/155.csv data/diez_ --additional-suffix=.csv && ls -l data/diez*.csv |wc -l

awk

Con awk podemos explorar una de esas columnas de datos del CSV.

Vamos a empezar con el mismo archivo pero vamos a incorporar el de la actividad contractual del Ayuntamiento de Madrid, disponible en su portal de datos abiertos.

Podemos descargarlo con wget o curl:

wget -O contratos-madrid.csv http://datos.madrid.es/egob/catalogo/216876-20-contratos-actividad.csv

Si hacemos un file al archivo, veremos si está bien:

file contratos-madrid.csv

La salida de este comando dice:

contratos-madrid.csv: Non-ISO extended-ASCII text, with very long lines, with CRLF line terminators

Parece que no está correctamente configurada su codificación de caracteres. De hecho, si vemos la primera fila:

Mes;A�o;Descripci�n Centro;Organismo;N�mero Contrato;N�mero Expediente;Descripci�n Contrato;Tipo Contrato;Procedimiento Adjudicaci�n;Art�culo;Apartado;Criterios Adjudicaci�n;Presupuesto Total          (IVA Incluido);Importe Adjudicaci�n   (IVA Incluido);Plazo;Fecha Adjudicaci�n;Nombre/Raz�n Social;NIF/CIF Adjudicatario;Fecha Formalizaci�n;Acuerdo Marco;Ingreso/Coste Cero;Observaciones;;;

Para convertir su codificación de caracteres emplearemos iconv:

iconv --from-code=ISO-8859-1 --to-code=UTF-8 contratos-madrid.csv > contratos.csv

Donde le decimos que de la codificación en ISO-8859-1 lo convierta en UTF-8.

Ver los datos de una columna

Antes lo hemos hecho con cut, pero ahora veremos con awk cómo ver los datos de una columna.

Primero, vamos a ver qué separador utiliza el CSV:

head -1 data/contratos.csv
awk -F "(" '{print $2}' data/155.csv >> data/155-awk-localidad.csv
awk '{filename = "wrd." int((NR-1)/10000) ".txt"; print >> filename}' inputfile

find

El comando find es un potente buscador sobre nuestros archivos y carpetas/directorios.

Si estamos usando Cygwin, antes debemos modificar la variable HOME.

Como cualquier otro comando, su estructura comienza con el comando, luego la ruta sobre la que deseamos buscar, las opciones de búsqueda y finalmente la expresión que buscamos, find [ruta] [opciones] [expresión].

Algunas opciones que tenemos son:

  • -name, busca por nombre
  • -size, busca por tamaño.
  • iname, busca en modo sensitivo.
  • atime, la fecha/hora de la última modificación.
  • Permisos
  • Propiedad

Solo find

Si solo lanzamos find, nos devolverá los archivos, directorios y subdirectorios por debajo del lugar donde nos encontramos.

Miremos primero dónde nos encontramos, volvamos a pwd:

pwd

¿Dónde nos encontramos?

Según el sistema operativo que utilicemos, esta orden nos devolverá rutas distintas: En GNU/Linux, como es mi caso:

/home/usuarix/proyectos/upv-periodismo-datos

En Windows:

c:\Users\Mengana\Documents\upv-periodismo-datos

find sobre directorio

En ese caso, si hacemos find sobre este directorio, vamos a ver qué contiene:

find

Nos devolverá:

  • Archivos.
  • Directorios.
  • Archivos de los directorios

Otras formas de find sobre directorio

Se puede hacer find también de dos formas:

  • find .
  • find . -print.

find con ruta, filtro y término

Pero normalmente lo utilizaremos siguiendo esta estructura:

find ruta filtro-de-búsqueda término-de-búsqueda

otra ruta

Podemos poner otra ruta:

find ~/docs/softwarelibre/

Si queremos ver los archivos que tengo en la carpeta softwarelibre que está dentro de docs dentro de mi home de usuarix.

find -atime

ejemplo find Readme.org

Vamos a buscar ahora todos los archivos Readme.org por debajo de un directorio con la opción -name y voy a entubar la salida con a wc -l

find ~/ownCloud/proyectos/ -name Readme.org | wc -l

ejemplo find comodines

Y también podemos incluir comodines. Por ejemplo, si quisiéramos todos los archivos *.org, no solo los que se llaman Readme.org:

find ~/ownCloud/proyectos -name *.org | wc -l

find regexp en archivo

Y si no queremos todos los archivos sino alguno en concreto, por ejemplo, que contuviera bash:

find ~/ownCloud/docs/softwarelibre -name *bash*.org

find tamaño de archivos

O tamaños de archivos:

find . -size +1M

find tamaño de directorios

O de directorios

find ~/ -folder +300M

find tipo de archivo

O tipo de archivo:

find . -type f *.org

find encontrar archivos y borrarlos

O encontrar archivos más antiguos que un año y borrarlos:

find .cache/ -type f -atime +365 -exec rm \;

find encontrar y ordenar

Encontrar y ordenar

find ~/Descargas/ -size +30M | sort -hr

find script bash

Y programar:

find ./ -name "*.png" | sort | while read file; do tesseract $file "`basename $file" | sed 's/\.[[:alnum:]]*$//'`.txt -l spa -psm 3; done

Donde:

  • Encontramos los archivos del tipo png sobre la carpeta elegida
  • Los ordenamos con sort
  • Empezamos bucle con while
  • Ejecutamos tesseract (herramienta OCR) sobre cada archivo $file
  • Cambiamos el nombre y el tipo a txt.

tr

Se utiliza para manipular el texto.

Convertir todo en mayúsculas

Para convertir todo el texto en mayúsculas, empleamos:

cat data/prueba-sed.txt | tr '[:lower:]' '[:upper:]' > data/prueba-sed-upper.txt

Comandos múltiples

  • Podemos ejecutar un comando
  • Pero también un comando y después otro
  • O un comando y si tiene éxito entonces el segundo.
  • Al reves, un comando si el primero no tuvo éxito.

Ejemplos

;

Si queremos ejecutar un comando y luego otro, independientemente de si el primero da error, utilizamos el operador ;

Ejemplo de éxito

En este ejemplo, la primera orden ofrece resultados, y por eso el echo tiene sentido:

grep BLESA black-is-black.csv | wc -l ; echo "líneas con la palabra BLESA...\n¡Qué pasada!"

Ejemplo fallido

En este ejemplo, no devuelve resultados porque no hay un archivo llamado black. Sin embargo, aparece el mensaje a continuación como en el primer caso, que resulta un poco incongruente.

grep CLESA black; echo "líneas con la palabra CLESA...\n¡Qué pasada!"

&&

Si queremos ejecutar el comando, y que siga con el segundo sólo si el primero devuelve algo, utilizamos el operador &&:

grep CLESA black && echo "líneas con la palabra CLESA...\n¡Qué pasada!"

||

Al contrario, si queremos ejecutar un comando después de otro pero queremos que se ejecute el segundo solo si el primero dio error, usaremos el operador ||:

grep CLESA black-is-black || echo "No hay ningún chorizo CLESA"

Sobre los datos

diff

diff Mostrar diferencias entre ficheros: diff Black.csv Black_corrupcion.csv Comparar dos archivos. Si son iguales, no devuelve nada, si difieren muestra el byte y el número de línea de la primera diferencia. cmp Black.csv Black_corrupcion.csv Para reemplazar

paste

para unir líneas de archivos

sort

para ordenar

uniq

Cuando se ofrece una entrada de datos ordenados, escribe una salida estándar con las líneas que son únicas.

Nos puede decir cuántas líneas están repetidas, las que no están repetidas o solo las que están repetidas.

For do

for do es una de las operaciones más simples y útiles que se pueden realizar en la línea de comandos.

for f i $(iconv -l); do echo "Convirtiendo $f ..."; iconv -f $f -t UTF-8 > file_name.csv > file_name.$f.csv; done

Establecer carácter y conversión de ficheros

Fichero de texto MSDOS a Unix

dos2unix filedos.txt fileunix.txt

Fichero de texto Unix a MSDOS

unix2dos fileunix.txt filedos.txt

Convertir fichero de texto en HTML

recode ..HTML < page.txt > page.html

Más conversiones

recode -l | more