Я пытаюсь удалить первые два столбца (которые меня не интересуют) из файла журнала DbgView. Кажется, я не могу найти пример, который печатается от столбца 3 и далее до конца строки. Обратите внимание, что в каждой строке есть переменное количество столбцов.
Как напечатать третий столбец до последнего столбца?
Ответы (18)
... или более простое решение: cut -f 3- INPUTFILE
просто добавьте правильный разделитель (-d), и вы получите тот же эффект.
tr -s '[:blank:]' ' '
[источник].
- person K3---rnc; 31.07.2014
awk '{ print substr($0, index($0,$3)) }'
найденное здесь решение:
http://www.linuxquestions.org/questions/linux-newbie-8/awk-print-field-to-end-and-character-count-179078/
В ответе Джонатана Файнберга каждое поле печатается в отдельной строке. Вы можете использовать printf
, чтобы перестроить запись для вывода в той же строке, но вы также можете просто переместить поля прыжком влево.
awk '{for (i=1; i<=NF-2; i++) $i = $(i+2); NF-=2; print}' logfile
NF
не разрешено POSIX.
- person kvantour; 04.01.2019
NF
.
- person Dennis Williamson; 04.01.2019
awk '{$1=$2=$3=""}1' file
NB: этот метод оставит «пробелы» в полях 1,2,3, но это не проблема, если вы просто хотите посмотреть вывод.
1
? по какому ключевому слову искать по awk
?
- person Itachi; 06.12.2018
{$1=$2=$3="";$0=$0;$1=$1}1
- person kvantour; 04.01.2019
Если вы хотите напечатать столбцы после 3-го, например, в той же строке, вы можете использовать:
awk '{for(i=3; i<=NF; ++i) printf "%s ", $i; print ""}'
Например:
Mar 09:39 20180301_123131.jpg
Mar 13:28 20180301_124304.jpg
Mar 13:35 20180301_124358.jpg
Feb 09:45 Cisco_WebEx_Add-On.dmg
Feb 12:49 Docker.dmg
Feb 09:04 Grammarly.dmg
Feb 09:20 Payslip 10459 %2828-02-2018%29.pdf
Он напечатает:
20180301_123131.jpg
20180301_124304.jpg
20180301_124358.jpg
Cisco_WebEx_Add-On.dmg
Docker.dmg
Grammarly.dmg
Payslip 10459 %2828-02-2018%29.pdf
Как видим, расчетная ведомость даже с пробелом отображается в правильной строке.
А как насчет следующей строки:
awk '{$1=$2=$3=""; print}' file
На основе предложения @ ghostdog74. Мой должен вести себя лучше, когда вы фильтруете строки, а именно:
awk '/^exim4-config/ {$1=""; print }' file
sed 's/\s\+//g'
в конце команды, чтобы обрезать ведущие пробелы
- person jumping_monkey; 13.03.2020
awk -v m="\x0a" -v N="3" '{$N=m$N ;print substr($0, index($0,m)+1)}'
Это обрезает то, что находится перед данным полем №, N, и печатает всю остальную часть строки, включая поле №N и сохраняя исходный интервал (он не переформатируется). Не имеет значения, появляется ли строка поля где-то еще в строке, что является проблемой с ответом daisaa.
Определите функцию:
fromField () {
awk -v m="\x0a" -v N="$1" '{$N=m$N; print substr($0,index($0,m)+1)}'
}
И используйте это так:
$ echo " bat bi iru lau bost " | fromField 3
iru lau bost
$ echo " bat bi iru lau bost " | fromField 2
bi iru lau bost
Вывод поддерживает все, включая конечные пробелы
Хорошо работает для файлов, где '/ n' является разделителем записей, поэтому у вас нет символа новой строки внутри строк. Если вы хотите использовать его с другими разделителями записей, используйте:
awk -v m="\x01" -v N="3" '{$N=m$N ;print substr($0, index($0,m)+1)}'
Например. Хорошо работает почти со всеми файлами, если в них не используется шестнадцатеричный номер символа. 1 внутри линий.
awk '{a=match($0, $3); print substr($0,a)}'
Сначала вы найдете позицию начала третьего столбца. С помощью substr вы напечатаете всю строку ($ 0), начиная с позиции (в данном случае a) до конца строки.
Следующая команда awk печатает последние N полей каждой строки, а в конце строки печатает символ новой строки:
awk '{for( i=6; i<=NF; i++ ){printf( "%s ", $i )}; printf( "\n"); }'
Найдите ниже пример, в котором перечисляется содержимое каталога / usr / bin, затем содержатся последние 3 строки, а затем печатаются последние 4 столбца каждой строки с помощью awk:
$ ls -ltr /usr/bin/ | tail -3
-rwxr-xr-x 1 root root 14736 Jan 14 2014 bcomps
-rwxr-xr-x 1 root root 10480 Jan 14 2014 acyclic
-rwxr-xr-x 1 root root 35868448 May 22 2014 skype
$ ls -ltr /usr/bin/ | tail -3 | awk '{for( i=6; i<=NF; i++ ){printf( "%s ", $i )}; printf( "\n"); }'
Jan 14 2014 bcomps
Jan 14 2014 acyclic
May 22 2014 skype
Что ж, вы можете легко добиться того же эффекта, используя регулярное выражение. Если предположить, что разделитель - это пробел, это будет выглядеть так:
awk '{ sub(/[^ ]+ +[^ ]+ +/, ""); print }'
awk '{ sub(/([^ ]+ +){2}/, ""); print }'
, который убирает узор в два раза.
- person erik; 11.01.2014
Решение Perl:
perl -lane 'splice @F,0,2; print join " ",@F' file
Используются следующие параметры командной строки:
-n
цикл вокруг каждой строки входного файла, не печатать автоматически каждую строку-l
удаляет символы новой строки перед обработкой и добавляет их после-a
режим autosplit - разбивать входные строки на массив @F. По умолчанию разделение на пробелы-e
выполнить код Perl
splice @F,0,2
чисто удаляет столбцы 0 и 1 из массива @F
join " ",@F
объединяет элементы массива @F, используя пробел между каждым элементом
Если ваш входной файл разделен запятыми, а не пробелами, используйте -F, -lane
Решение Python:
python -c "import sys;[sys.stdout.write(' '.join(line.split()[2:]) + '\n') for line in sys.stdin]" < file
Немного поздно, но ничего из вышеперечисленного, похоже, не сработало. Попробуйте это, используя printf, вставляя пробелы между ними. Я решил не использовать новую строку в конце.
awk '{for(i=3;i<=NF;++i) printf("%s ", $i) }'
awk '{for (i=4; i<=NF; i++)printf("%c", $i); printf("\n");}'
печатает записи, начиная с 4-го поля до последнего поля в том же порядке, в котором они были в исходном файле
В Bash вы можете использовать следующий синтаксис с позиционными параметрами:
while read -a cols; do echo ${cols[@]:2}; done < file.txt
Подробнее: Обработка позиционных параметров на Bash Hackers Wiki
Если речь идет только об игнорировании первых двух полей и если вам не нужен пробел при маскировке этих полей (как это делают некоторые из ответов выше):
awk '{gsub($1" "$2" ",""); print;}' file
awk '{$1=$2=""}1' FILENAME | sed 's/\s\+//g'
Первые два столбца очищаются, sed
удаляет начальные пробелы.
В AWK столбцы называются полями, поэтому NF - это ключ
все строки:
awk -F '<column separator>' '{print $(NF-2)}' <filename>
только первая строка:
awk -F '<column separator>' 'NR<=1{print $(NF-2)}' <filename>
awk 'NF >= 3'
- person SergioAraujo; 10.05.2013
newline separator
. У меня не работает.
- person gies0r; 09.04.2017
awk '{for(i=3;i<=NF;++i)printf $i""FS ; print ""}'
(printf
не будет печатать символ новой строки, а print ""
добавит новую строку после того, как другие поля будут напечатаны)
- person lauhub; 19.09.2017
echo $(seq 1 10) | awk '{for (i=3; i<=NF; i++) printf $i FS}'
, что дает: 3 4 5 6 7 8 9 10
.
- person x-yuri; 05.12.2017