Почему awk неправильно размещает мои поля? - PullRequest
1 голос
/ 21 февраля 2012

У меня есть файл с несколькими полями, которые я хочу настроить с помощью awk.

$ cat file.txt
  133     288K     280K      80K      64K  /system/bin/installd
  121     272K     264K      79K      68K  /system/bin/servicemanager
  698     248K     240K      79K      72K  /system/bin/servicemanager
 1348     248K     240K      79K      72K  /system/bin/servicemanager
  126     244K     236K      65K      56K  /system/bin/debuggerd
$ cat file.txt | awk '{print $NF $1}'
133stem/bin/installd
121stem/bin/servicemanager
698stem/bin/servicemanager
1348tem/bin/servicemanager
126stem/bin/debuggerd

Это не то, что я хотел! Я надеялся, что цифры появятся справа от текста, а не будут совпадать. Есть идеи, почему это происходит?

Ответы [ 5 ]

3 голосов
/ 21 февраля 2012

Я подозреваю, что вы видите из-за возврата каретки, вероятно, из-за разделителей строк в стиле CRLF в Windows / DOS. Вы можете проверить, отметив cat -vte file.txt, и возврат каретки будет отображаться как ^M. Вы можете отфильтровать их в строке с tr:

cat file.txt | tr -d '\r' | awk '{print $NF $1}'

Это должно исправить проблему с перекрытием. Имейте в виду, что awk не будет вставлять разделитель выходного поля в вышеприведенное, если вы не поставите запятую между $NF и $1 (т.е. между ними не будет пробела)

2 голосов
/ 21 февраля 2012

Для других сообщений вам нужно dos2unix file.txt или подобное.

Вам также нужно указать какое-то значение для разделения двух столбцов, которые вы печатаете, т.е.

 # use the defualt value for FS
 awk '{print $NF , $1}' file.txt 

 # use a tab
 awk '{print $NF "\t" $1}' file.txt

 # use a space
 awk '{print $NF " " $1}' file.txt

Также обратите внимание, что использование cat file.txt | принесет вам награду Useless Use Of Cat в некоторых кругах :-), поэтому я включил более прямое решение вашей проблемы в приведенные выше примеры.

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

2 голосов
/ 21 февраля 2012

Похоже, что ваши строки заканчиваются возвратом каретки до их перевода строки;то есть, похоже, что у вас есть окончания Windows.Попробуйте запустить dos2unix для файла перед выполнением команды:

dos2unix file.txt
1 голос
/ 21 февраля 2012

код: cat file.txt | awk '{ print $2,$3,$4,$5,$6,$1 }'

Вывод: 288K 280K 80K 64K / system / bin / installd 133 ...

0 голосов
/ 21 февраля 2012

Возможно, eol равно \r. Сначала измените на \n.

mac2unix file.txt
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...