couper la colonne 2 du fichier texte

15

Mon fichier texte n'a pas de délimiteur pour spécifier le séparateur juste des espaces, comment puis-je couper la colonne 2 dans le fichier de sortie,

39    207  City and County of San Francisc   REJECTED          MAT = 0
78    412  Cases and materials on corporat   REJECTED          MAT = 0
82    431  The preparation of contracts an   REJECTED          MAT = 0

Donc, la sortie dont j'ai besoin est

207
412
432
riley
la source

Réponses:

13

Il est plus simple de awktraiter plusieurs espaces consécutifs comme un seul, donc

awk '{print $2}' file

impressions

207
412
431

Mais évidemment, il existe de très nombreux autres outils qui feront le travail, même non conçus pour des tâches telles que grep:

grep -Po '^[^ ]+[ ]+\K[^ ]+' file
jimmij
la source
6

Utilisez des canaux pour envoyer vos données (par exemple, cat columns.txt) en coupe.

cat columns.txt | cut -d" " -f5

Dans l'exemple de données que vous avez fourni, un seul délimiteur d'espace place les données souhaitées dans le champ 5. Pour envoyer cette sortie dans un autre fichier, utilisez la redirection.

cat collumns.txt | cut -d" " -f5 > field2.txt

En utilisant la commande awk, vous pouvez faire quelque chose comme ci-dessous qui reconnaît automatiquement le champ que vous recherchez car il y a des données (?) J'ai besoin d'en savoir plus sur awk.

awk -F' ' '{print $2}' columns.txt
aeiounix
la source
3
L'incatation cat ... |est rarement nécessaire. La plupart des commandes Unix aiment cutprendre un ou plusieurs fichiers d'entrée comme arguments, par exemple cut -d" " -f5 columns.txt.
Denis Howe
1

comme l'a dit @jimmij, awk '{print $2}' fileest la réponse la plus simple.

Si, pour une raison quelconque, vous ne voulez pas utiliser awket insistez sur l'utilisation cut, vous pouvez utiliser sedpour convertir chaque instance de deux ou plusieurs espaces en un seul onglet ( cutle délimiteur par défaut de) avant de passer en coupe:

$ sed -e 's/  \+/\t/g' riley.txt | cut -f2 
207
412
431
cas
la source
0

Vous pouvez toujours utiliser des espaces simples comme délimiteur, vous aurez juste plus de colonnes. Augmentez la valeur que vous donnez cut -d' ' -fde 2 à 5, ou peut-être 6. Augmentez le nombre jusqu'à ce que vous obteniez les résultats souhaités.

Ryder
la source
0
grep -Po '^[^ ]+[ ]+\K[^ ]+' file

Ce qui précède est très utile lorsque les utilitaires Linux comme awk pour l'extraction de données ne fonctionnent pas si vous passez à l'utilisateur "root" dans un script shell comme ci-dessous:

sudo -i <<EOF
ps aux | grep -E -i "[l]js"  |grep -v "javaagent" | awk '{print $2}' # So awk won't work here
ps aux | grep -E -i "[l]js"  | grep -v "javaagent" | grep -Po '^[^ ]+[ ]+\K[^ ]+'
EOF
Alok Tiwari
la source
1
La seule raison pour laquelle " awkne fonctionnera pas" dans votre exemple est que le document ici n'est pas cité, ce $2qui signifie que le serait étendu par le shell au deuxième paramètre positionnel. La solution n'est probablement pas de passer à une grepcommande mais d'échapper au $in $2as \$2ou de simplement citer l'intégralité du document en utilisant <<'EOF'à la place de <<EOF. Notez également que la tâche dans votre exemple est plus simplement effectuée par pgrep.
Kusalananda
Merci beaucoup @Kusalananda. Ça a marché comme sur des roulettes.
Alok Tiwari