[1]+ Exit 1
...означает, что первое запущенное вами фоновое задание([1]
)только что завершилось с кодом выхода 1.
Обычно код выхода 0 означает "нет ошибки", а любой не -нулевой код выхода означает какую-то ошибку :без какого-либо сообщения об ошибке, вам, вероятно, нужно изучить код R, чтобы увидеть, что пошло не так.
команда
awk '{$1=$2=$3="";print $0}' filename| sed -r "s/^\s+//g"
команда
cb0 cb1 cb2 cb3 ct0 ct1 ct2 ct3
Пробовал в 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
Если вы хотите сохранить расстояние между полями, которые будут сохранены, вы также можете сделать:
<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>
.
с 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
Раствор перла:
пробел -разделитель:
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
), индексы отсчитываются от нуля -.
Улучшение трюка $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
избавится от ведущих OFS
s (уведомления о том, что индексы начинаются с 1 вawk
).
печать вставляет новую строку по умолчанию. Используйте 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
}'
$ 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
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
Не отвечает на ваш вопрос, используя запрошенный подход awk
, но я просто укажу, что cut
можно использовать для этой задачи.
cut -f4- -d' ' input
Как насчет
awk 'sub ("^" $1 FS $2 FS $3 FS, _)' file
cb0 cb1 cb2 cb3 ct0 ct1 ct2 ct3