Comment séparer les champs avec un espace ou une tabulation dans awk

53

En jouant avec awkje suis venu pour exécuter:

ls -la >> a.txt ; awk {'print $5  $1'} a.txt ;

Ceci donne une sortie comme:

53277-rw-------
52347-rw-------

Comment puis-je obtenir un espace entre ces deux amis de sortie?

rɑːdʒɑ
la source
1
À titre de conseil, vous ne devez pas analyser le résultat de ls. Cela vous mordra dans le dos tôt ou tard.
gniourf_gniourf
Dans awk, pour concaténer deux chaînes, il suffit de les placer côte à côte -print $5 $1
glenn jackman
2
@kenorb et les électeurs proches, le doublon lié n’est pas du tout un doublon. Ils savent déjà comment imprimer les champs par prémisse ( awk {'print $5 $1'} a.txt). Ils demandent comment insérer un espace entre les champs n ° 1 et n ° 5.
Kos

Réponses:

73

Il suffit de changer la ligne pour

ls -la >> a.txt ; awk {'print $5 "        " $1'} a.txt ;

cela devrait imprimer la sortie avec des espaces.

J'espère que cela t'aides.

Modifier:

Comme suggéré par McNisse, vous pouvez utiliser printf, qui vous fournirait un bon format de sortie

ls -la >> a.txt ; awk {'printf ("%5s\t%s\n", $5, $1)'} a.txt ;
devav2
la source
4
La printffonction offre un meilleur contrôle, surtout si vous souhaitez formater des nombres. printf("%s\t%s\n", $5, $1)
McNisse
1
Y at-il une faute de frappe dans la réponse ci-dessus? qu'est-ce que cela 5ssignifieawk {'printf ("%5s\t%s\n", $5, $1)'}
Vishal
67

Une autre technique spécifique à awk, utilisez le "séparateur de champs de sortie"

ls -la | awk -v OFS='\t' '{print $5, $1}'

La virgule est cruciale ici.

Glenn Jackman
la source
ça marche mais ça donne raison $1à
newline
9

Un moyen simple d'obtenir des onglets est:

awk {'print $5"\t"$1'}
becko
la source
6

Je sais que c'est un vieux fil, mais j'apprends et je trouve ces messages utiles. Ma meilleure solution consistait à utiliser gawk pour insérer des espaces entre les variables.

ls -la | gawk '{print $1, $9}'
codeJediNinjaDork
la source
3
-1: Rien de nouveau. gawk, mawkou tout autre awk, ils insèrent tous des espaces si vous utilisez la virgule, comme le dit cette réponse .
Muru
1
Devrait être ls -la | awk '{print $1, $9}'. Comme muru l'a dit, ce gawkn'est pas nécessaire.
Nick Crawford
1

Pour placer l'espace entre les arguments, ajoutez simplement " ", par exemple awk {'print $5" "$1'}.

Cependant, il n'est pas recommandé d' analyser la sortie de la lscommande , car elle n'est pas fiable et que la sortie est destinée aux humains, pas aux scripts. Par conséquent, utilisez des commandes alternatives telles que findou stat.

Voici un exemple utilisant GNU stat:

$ stat -t *
001.txt 23 8 81a4 501 20 1000004 242236402 1 0 0 1460260387 1460260239 1460260239 1460260194 4096
7c1c.txt 21 8 81a4 501 20 1000004 242236595 1 0 0 1460261322 1460260486 1460260486 1460260486 4096

qui imprimera votre sortie conviviale pour la machine (sous forme abrégée), de sorte que vous puissiez obtenir exactement ce dont vous avez besoin. Utilisez ensuite -cpour utiliser le format spécifique, ou l' utilisation awk, cutou readpour obtenir les colonnes de droite.

Vérifiez stat --helppour d'autres options. Par exemple, pour imprimer le jour de modification, consultez cet exemple .

Kenorb
la source
Il semble que le PO tente d'analyser la sortie à des fins de lecture humaine et non pour exécuter un script (comme for i in ls; do $i).
mardi