awk напечатать от n-го столбца до последнего

[1]+  Exit 1

...означает, что первое запущенное вами фоновое задание([1])только что завершилось с кодом выхода 1.

Обычно код выхода 0 означает "нет ошибки", а любой не -нулевой код выхода означает какую-то ошибку :без какого-либо сообщения об ошибке, вам, вероятно, нужно изучить код R, чтобы увидеть, что пошло не так.

10
13.01.2020, 20:39
11 ответов

команда

awk '{$1=$2=$3="";print $0}' filename| sed -r "s/^\s+//g"

команда

cb0 cb1 cb2 cb3 ct0 ct1 ct2 ct3
8
27.01.2020, 19:59

Пробовал в Python 2:

#!/usr/bin/python
k=open('filename','r')
for i in k:
    k=i.strip().split(' ')[3:]
    print " ".join(k)

выход

cb0 cb1 cb2 cb3 ct0 ct1 ct2 ct3
2
27.01.2020, 19:59

Если вы хотите сохранить расстояние между полями, которые будут сохранены, вы также можете сделать:

<file awk '{sub(/^[[:blank:]]*([^[:blank:]]+[[:blank:]]+){3}/, ""); print}'

(однако обратите внимание, что не все awkреализации поддерживают {3}, даже несмотря на то, что это POSIX ).

То есть используйте регулярное выражение, которое соответствует первым 3 полям.

Или просто используйте для этого sed:

<file sed 's/^[[:blank:]]*\([^[:blank:]]\{1,\}[[:blank:]]\{1,\}\)\{3\}//'

Те предполагают, что все строки во входных данных имеют как минимум 4 поля.

На входе a b c d <tab>e f <nl>будет вывод d <tab>e f <nl>.

7
27.01.2020, 19:59

с awk, который поддерживает регулярное выражение в разделителе полей, вы можете сделать:

awk -F'^[[:blank:]]*([^ \t]*[ \t]+){3}' '{ print $2 }' infile
cb0 cb1 cb2 cb3 ct0 ct1 ct2 ct3

замените число 3 в {3}на количество столбцов, которые нужно игнорировать с самого начала; и пробел/табуляция с разделителем полей, который разделяет ваши столбцы, кроме пробелов; поэтому печать $2будет оставшимися столбцами до конца; это решение сохранит несколько пробелов между полями, если они есть в результате.

примечания :, чтобы не печатать пустую строку, если была строка с равным или меньшим количеством полей, чем 3 (, которая указывает#(количество )столбцов, которые необходимо вырезать ), добавить NF>1] к команде.

awk -F'^[[:blank:]]*([^ \t]*[ \t]+){3}' 'NF>1{ print $2 }' infile

[[:blank:]]*используется, чтобы избежать ошибочного вывода, когда FS является пробелом; если FS это что-то другое (e.x :запятая ,), то команда будет еще проще:

awk -F'^([^,]*,){3}' 'NF>1{ print $2 }' infile
3
27.01.2020, 19:59

Раствор перла:

пробел -разделитель:

perl -lane 'print "@F[3..$#F]"' file

вкладка -с разделителями:

perl -F'\t' -lane 'print join "\t", @F[3..$#F]' file

Здесь флагами строки команды -являются:
-e:говорит интерпретатору perl использовать встроенный код, а не код в файле.
-n:перебирает ввод по одной строке за раз, назначая входную строку на $_.
-l:удалить разделитель входной строки (новая строка в UNIX )перед кодом в одной строке -и добавить разделитель выходной строки после print.
-a:splitкаждая строка в массиве @F, по умолчанию с пробелами.
-F:splitна предоставленном шаблоне, а не на пробеле.

@F[3..$#F]:поля с индексами от 3до$#F(последний элемент @F), индексы отсчитываются от нуля -.

0
27.01.2020, 19:59

Улучшение трюка $1=$2=$3="", которое работает с любымFSили OFS, при условии, что нормализация выходной строки к $4 OFS $5 OFS...допустима:

awk 'BEGIN{p=length(OFS)*3+1} {$1=$2=$3="";print substr($0,p)}'

Присвоение значения любому полю (например.$1=""или$1=$1)приведет к$0(перестроению всей записи/строки )(при первом использовании )путем объединения полей $1, $2,... с переменной OFS.

Таким образом, $1 = $2 = $3 = ""приведет к установке $0на OFS OFS OFS $4 OFS $5..., а substrизбавится от ведущих OFSs (уведомления о том, что индексы начинаются с 1 вawk).

3
27.01.2020, 19:59

печать вставляет новую строку по умолчанию. Используйте printf вместо print

echo "vddp vddpi vss cb0 cb1 cb2 cb3 ct0 ct1 ct2 ct3" | awk ' { for (i=4; i<=NF; i++) printf "%s ",$i }'

Для нескольких строк:

cat filename.txt | awk ' { for (i=4; i<=NF; i++) 
if (i==NF) 
printf "%s\n", $i
else
printf "%s ", $i
}'
1
27.01.2020, 19:59

Сохранить пробел после удаления поля (s ):

$ sed -E 's/^[[:blank:]]*([^[:blank:]]+[[:blank:]]*){3}//' file
$ awk '{sub(/^[[:blank:]]*([^[:blank:]]+[[:blank:]]*){3}/,"")};1' file
$ grep -oP '^[[:blank:]]*([^[:blank:]]+[[:blank:]]*){3}\K.*' file

Описание

Существует способ сопоставления полей с помощью регулярного выражения:[[:blank:]]*[^[:blank:]]+.
Соответствует необязательному потоку пробелов (, пробелу или табуляции ), за которым следует поток не -пробелов. Если этот шаблон повторяется 3 раза, сопоставляются 3 поля (с начальным пробелом ). Затем их можно удалить с помощью любого инструмента, способного обрабатывать регулярные выражения (с вариациями ). Обратите внимание, что перед и/или после каждого поля могут быть пробелы, эти пробелы также должны совпадать. Сопоставление любого начального пробела и ограничивающего замыкающего пробела сделает регулярное выражение немного длиннее :^[[:blank:]]*([^[:blank:]]+[[:blank:]]*){n}, где n — целое число, указывающее на последнее совпавшее поле.

Альтернатива с GNU awk:

$ awk -vrem=3 '{ 
                 n=split($0,f,FS,seps);
                 for(i=rem+1;i<=n;i++){
                                        printf("%s%s",$i,seps[i])
                                      };
                 print ""
               }
              '  file

Пустое пространство свернуто

$ awk '{$1=$2=$3=""; $0=$0; $1=$1 } 1 ' file      # thanks RudiC
0
27.01.2020, 19:59
awk -v n=4 '{ for (i=n; i<=NF; i++) printf "%s%s", $i, (i<NF ? OFS : ORS)}' input

Это примет n как значение nи переберет это число через последнее поле NF, для каждой итерации будет напечатано текущее значение, если это не последнее значение в строке, которое будет напечатано OFSпосле него (пробел ), если это последнее значение в строке, будет напечатано ORSпосле него (новая строка ).

$ echo 'vddp vddpi vss cb0 cb1 cb2 cb3 ct0 ct1 ct2 ct3' |
> awk -v n=4 '{ for (i=n; i<=NF; i++) printf "%s%s", $i, (i<NF ? OFS : ORS)}'
cb0 cb1 cb2 cb3 ct0 ct1 ct2 ct3
14
27.01.2020, 19:59

Не отвечает на ваш вопрос, используя запрошенный подход awk, но я просто укажу, что cutможно использовать для этой задачи.

cut -f4- -d' ' input
12
27.01.2020, 19:59

Как насчет

awk 'sub ("^" $1 FS $2 FS $3 FS, _)' file
cb0 cb1 cb2 cb3 ct0 ct1 ct2 ct3  
1
27.01.2020, 19:59

Теги

Похожие вопросы