Как разделить поля пробелом или табуляцией в awk

53

Играя с awkя пришел казнить:

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

Это дает вывод как:

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

Как я могу получить пробел между этими двумя друзьями вывода?

rɑːdʒɑ
источник
1
Как совет, вы не должны анализировать вывод ls. Это рано или поздно укусит вас в спину.
gniourf_gniourf
В awk, чтобы объединить две строки, вы просто помещаете их рядомprint $5 $1
Гленн Джекман
3
Возможный дубликат Как выбрать поле / столбец из вывода `ls -l`?
Кенорб
2
@kenorb и близкие избиратели, связанный дубликат вообще не является дубликатом. Они уже знают, как напечатать поля по предпосылке ( awk {'print $5 $1'} a.txt). Они спрашивают, как поместить пробел между полем № 1 и полем № 5.
Кос

Ответы:

73

Просто измените строку на

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

это должно напечатать вывод с пробелами.

Надеюсь это поможет.

Редактировать:

Как предлагает McNisse, вы можете использовать printf, который обеспечит вам хороший выходной формат

ls -la >> a.txt ; awk {'printf ("%5s\t%s\n", $5, $1)'} a.txt ;
devav2
источник
4
printfФункция обеспечивает лучший контроль, особенно если вы хотите форматирование чисел. printf("%s\t%s\n", $5, $1)
Макнисс
1
Есть ли опечатка в ответе выше? что 5sзначит вawk {'printf ("%5s\t%s\n", $5, $1)'}
Вишал
67

Еще один специфичный для awk метод, использующий «разделитель поля вывода»

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

Запятая имеет решающее значение здесь.

Гленн Джекман
источник
это работает, но причина, $1чтобы перейти на новую
строку
9

Простой способ получить вкладки:

awk {'print $5"\t"$1'}
becko
источник
6

Я знаю, что это старая ветка, но я только учусь и считаю эти посты полезными. Моим лучшим решением было использовать gawk для вставки пробелов между переменными для вас.

ls -la | gawk '{print $1, $9}'
codeJediNinjaDork
источник
3
-1: ничего нового. gawk, mawkили любой другой awk, они все вставляют пробелы, если вы используете запятую, о чем говорит этот ответ .
Муру
1
Должно быть ls -la | awk '{print $1, $9}'. Как сказал Муру, gawkнет необходимости.
Ник Кроуфорд
1

Чтобы разместить пробел между аргументами, просто добавьте " ", например awk {'print $5" "$1'}.

Однако не рекомендуется анализировать выходные данные lsкоманды , так как это ненадежно, а выходные данные предназначены для людей, а не для сценариев. Поэтому используйте альтернативные команды, такие как findили stat.

Вот пример использования 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

которая выведет вам удобный для машин вывод (в краткой форме), так что вы сможете получить именно то, что вам нужно. Затем используйте -cдля использования определенного формата, или используйте awk, cutили, readчтобы получить правильные столбцы.

Проверьте stat --helpдля дальнейших вариантов. Например, чтобы напечатать день модификации, проверьте этот пример .

kenorb
источник
Похоже, что ОП пытается проанализировать вывод для целей чтения человеком, а не для запуска сценария (например for i in ls; do $i).
mchid