Я намагаюся видалити перші два стовпці (з яких мене не цікавлять) з файлу журналу DbgView. Я не можу знайти приклад, який друкує з стовпця 3 і далі до кінця рядка. Зауважте, що кожен рядок має змінну кількість стовпців.
Я намагаюся видалити перші два стовпці (з яких мене не цікавлять) з файлу журналу DbgView. Я не можу знайти приклад, який друкує з стовпця 3 і далі до кінця рядка. Зауважте, що кожен рядок має змінну кількість стовпців.
Відповіді:
... або більш просте рішення: cut -f 3- INPUTFILE
просто додайте правильний роздільник (-d), і ви отримали такий же ефект.
awk '{for(i=3;i<=NF;++i)print $i}'
awk '{for(i=3;i<=NF;++i)printf $i""FS ; print ""}'
( printf
не буде друкувати print ""
echo $(seq 1 10) | awk '{for (i=3; i<=NF; i++) printf $i FS}'
, що дає: 3 4 5 6 7 8 9 10
.
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.
NF
можна зменшити їх.
awk '{$1=$2=$3=""}1' file
Примітка: цей метод залишить «пробіли» в 1,2,3 полях, але це не проблема, якщо ви просто хочете подивитися на вихід.
1
? за яким ключовим словом слід шукати awk
?
{$1=$2=$3="";$0=$0;$1=$1}1
Якщо ви хочете надрукувати стовпці після 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} 'файл
На основі пропозиції @ ghostdog74. Моя повинна поводитись краще, коли ви фільтруєте лінії, тобто:
awk '/ ^ exim4-config / {$ 1 = ""; print} 'файл
sed 's/\s\+//g'
наприкінці команди для обрізки провідних просторів
awk -v m="\x0a" -v N="3" '{$N=m$N ;print substr($0, index($0,m)+1)}'
Це розбиває те, що знаходиться перед заданими полями nr., N, і друкує всі інші рядки, включаючи поле nr.N та підтримуючи початковий інтервал (він не переформатується). Немає значення, якщо рядок поля з’являється ще десь у рядку, що є проблемою у відповіді дайса.
Визначте функцію:
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)}'
наприклад. Добре працює з майже всіма файлами, доки вони не використовують шістнадцятковий символ char. 1 всередині рядків.
Наступна команда 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 }'
що знімає візерунок у два рази.
Розчин Perl:
perl -lane 'splice @F,0,2; print join " ",@F' file
Ці параметри командного рядка використовуються:
-n
циклічно навколо кожного рядка вхідного файлу, не друкуйте кожен рядок автоматично
-l
видаляє нові рядки перед обробкою та додає їх згодом
-a
режим автоспліт - розділити вхідні лінії в масив @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
У Bash ви можете використовувати наступний синтаксис з позиційними параметрами:
while read -a cols; do echo ${cols[@]:2}; done < file.txt
Дізнайтеся більше: Обробка позиційних параметрів на Bash Hackers Wiki
У AWK стовпці називаються полями, отже, NF є ключем
всі рядки:
awk -F '<column separator>' '{print $(NF-2)}' <filename>
лише перший рядок:
awk -F '<column separator>' 'NR<=1{print $(NF-2)}' <filename>