Использование awk для печати всех столбцов от n-го до последнего - PullRequest
270 голосов
/ 03 июня 2010

Эта строка работала, пока во втором поле не было пробелов.

svn status | grep '\!' | gawk '{print $2;}' > removedProjs

есть ли способ заставить awk распечатать все за 2 доллара или больше? (3 доллара, 4 доллара ... пока у нас больше не будет столбцов?)

Полагаю, мне следует добавить, что я делаю это в среде Windows с Cygwin.

Ответы [ 24 ]

4 голосов
/ 12 октября 2017
awk '{ for(i=3; i<=NF; ++i) printf $i""FS; print "" }'

lauhub предложил это правильное, простое и быстрое решение здесь

3 голосов
/ 12 октября 2012

Это то, что я предпочел из всех рекомендаций:

Печать с 6-го по последний столбец.

ls -lthr | awk '{out=$6; for(i=7;i<=NF;i++){out=out" "$i}; print out}'

или

ls -lthr | awk '{ORS=" "; for(i=6;i<=NF;i++) print $i;print "\n"}'
2 голосов
/ 16 сентября 2015

Perl решение:

perl -lane 'splice @F,0,1; print join " ",@F' file

Используются следующие параметры командной строки:

  • -n цикл вокруг каждой строки входного файла, не печатать автоматически каждую строку

  • -l удаляет символы новой строки перед обработкой и добавляет их потом

  • -a режим автоматического разделения - разбить входные строки на массив @F. По умолчанию расщепление по пробелам

  • -e выполнить код perl

splice @F,0,1 чисто удаляет столбец 0 из массива @F

join " ",@F объединяет элементы массива @F, используя пробел между каждым элементом


Python-решение:

python -c "import sys;[sys.stdout.write(' '.join(line.split()[1:]) + '\n') for line in sys.stdin]" < file

2 голосов
/ 10 февраля 2015

Если вам нужны определенные столбцы, напечатанные произвольным разделителем:

awk '{print $3 "  " $4}'

Кол # 3 Кол # 4

awk '{print $3 "anything" $4}'

цв # 3anythingcol # 4

Так, если у вас есть пробел в столбце, это будет два столбца, но вы можете связать его с любым разделителем или без него.

0 голосов
/ 10 марта 2014

Это сработает, если вы используете Bash и можете использовать столько «x», сколько элементов вы хотите отбросить, и игнорирует несколько пробелов, если они не экранированы.

while read x b; do echo "$b"; done < filename
0 голосов
/ 29 сентября 2017

Эта awk функция возвращает подстроку $0, которая включает поля от begin до end:

function fields(begin, end,    b, e, p, i) {
    b = 0; e = 0; p = 0;
    for (i = 1; i <= NF; ++i) {
        if (begin == i) { b = p; }
        p += length($i);
        e = p;
        if (end == i) { break; }
        p += length(FS);
    }
    return substr($0, b + 1, e - b);
}

Чтобы получить все, начиная с поля 3:

tail = fields(3);

Чтобы получить раздел $0, который охватывает поля с 3 по 5:

middle = fields(3, 5);

b, e, p, i ерунда в списке параметров функции - это просто awk способ объявления локальных переменных.

0 голосов
/ 26 октября 2016

Мне не понравилось ни одно из представленных здесь решений awk, потому что я хотел извлечь первые несколько столбцов, а затем распечатать остальные, поэтому вместо этого обратился к perl. Следующий код извлекает первые два столбца и отображает остаток как есть:

echo -e "a  b  c  d\te\t\tf g" | \
  perl -ne 'my @f = split /\s+/, $_, 3; printf "first: %s second: %s rest: %s", @f;'

Преимущество по сравнению с perl решением от Крис Кокнат состоит в том, что на самом деле только первые n элементов отделяются от входной строки; остальная часть строки вообще не разделяется и поэтому остается полностью неповрежденной. Мой пример демонстрирует это с помощью сочетания пробелов и табуляции.

Чтобы изменить количество столбцов, которые нужно извлечь, замените 3 в примере на n + 1.

0 голосов
/ 10 апреля 2016

Примеры Awk здесь выглядят сложными, вот простой синтаксис оболочки Bash:

command | while read -a cols; do echo ${cols[@]:1}; done

Где 1 - ваш n -й столбец, начиная с 0.


Пример

Учитывая это содержимое файла (in.txt):

c1
c1 c2
c1 c2 c3
c1 c2 c3 c4
c1 c2 c3 c4 c5

вот вывод:

$ while read -a cols; do echo ${cols[@]:1}; done < in.txt 

c2
c2 c3
c2 c3 c4
c2 c3 c4 c5
0 голосов
/ 31 июля 2015

Если вы хотите форматированный текст, объедините ваши команды с echo и используйте $ 0, чтобы напечатать последнее поле.

Пример:

for i in {8..11}; do
   s1="$i"
   s2="str$i"
   s3="str with spaces $i"
   echo -n "$s1 $s2" | awk '{printf "|%3d|%6s",$1,$2}'
   echo -en "$s3" | awk '{printf "|%-19s|\n", $0}'
done

Печать:

|  8|  str8|str with spaces 8  |
|  9|  str9|str with spaces 9  |
| 10| str10|str with spaces 10 |
| 11| str11|str with spaces 11 |
0 голосов
/ 13 октября 2014
ls -la | awk '{o=$1" "$3; for (i=5; i<=NF; i++) o=o" "$i; print o }'

из этот ответ неплох, но естественный интервал пропал.
Пожалуйста, сравните это с этим:

ls -la | cut -d\  -f4-

Тогда вы увидите разницу.

Четный ls -la | awk '{$1=$2=""; print}', основанный на ответе , проголосовавшем лучше всего, пока не сохраняет форматирование.

Таким образом, я бы использовал следующее, и это также позволяет в начале явно выбирать столбцы:

ls -la | cut -d\  -f1,4-

Обратите внимание, что для столбцов также учитываются все пробелы, поэтому, например, в приведенных ниже столбцах 1 и 3 пусто, 2 - INFO, а 4 -

$ echo " INFO  2014-10-11 10:16:19  main " | cut -d\  -f1,3

$ echo " INFO  2014-10-11 10:16:19  main " | cut -d\  -f2,4
INFO 2014-10-11
$
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...