Подробное объяснение awk Linux Three Musketeers

Linux

Первое введение в awk и примеры выражений

  • язык со странным названием

  • Сканирование и обработка схемы, обработка данных и формирование отчетов.

awk — это не просто команда в системе Linux, а язык программирования; его можно использовать для обработки данных и создания отчетов (Excel); обрабатываемыми данными могут быть один или несколько файлов; они могут поступать непосредственно из стандартного ввода или стандартного ввода. входные данные могут быть получены через конвейеры; awk может напрямую редактировать команды в командной строке для работы или может быть написан как awk-программа для более сложных приложений.

sed обрабатывает текстовые потоки редактора потоков, водные потоки.

1. Введение в среду awk

В этой статье используется awk gawk, версия awk GNU.

[root@creditease awk]# cat /etc/redhat-release
CentOS Linux release 7.5.1804 (Core)
[root@creditease awk]# uname -r
3.10.0-862.el7.x86_64
[root@creditease awk]# ll `which awk`
lrwxrwxrwx. 1 root root 4 Nov  7 14:47 /usr/bin/awk -> gawk 
[root@creditease awk]# awk --version
GNU Awk 4.0.2

Во-вторых, формат awk

Инструкции Awk состоят из шаблонов, действий или комбинации шаблонов и действий.

  • Шаблон — это шаблон, который можно понимать как сопоставление шаблона sed.Он может состоять из выражений или может быть регулярным выражением между двумя косыми чертами. Например, NR==1, это шаблон, который можно понимать как условие.

  • Действие Action I.E., одним или несколькими операторами внутри скобок состава, разделенных «Заявлением». Используйте как формат AWK.

3. Записи и домены

название значение
record запись, строка
filed домен, область, поле, столбец

1) NF (число полей) представляет количество областей (столбцов) в строке, а $NF занимает последнюю область.

2) Символ $ указывает на столбец (площадь), $1,2,NF

3) NR (количество записей) Номер линии, номер записи AWK для каждой строки имеет встроенную переменную для сохранения NR, каждый из которых закончен со значением +1, автоматически записывает NR

4) FS (-F) разделитель полей разделитель столбцов, который разделяет строку на несколько столбцов

3.1 Укажите разделитель

[root@creditease awk]# awk -F "#" '{print $NF}' awk.txt 
GKL$123
GKL$213
GKL$321
[root@creditease awk]# awk -F '[#$]' '{print $NF}' awk.txt 
123
213
321

3.2 Условные действия Основные условия и действия

[root@creditease awk]# cat awk.txt 
ABC#DEF#GHI#GKL$123
BAC#DEF#GHI#GKL$213
CBA#DEF#GHI#GKL$321
[root@creditease awk]# awk -F "#" 'NR==1{print $1}' awk.txt
ABC

3.3 Только условие

 [root@creditease awk]# awk -F "#" 'NR==1' awk.txt
ABC#DEF#GHI#GKL$123

По умолчанию будет действие {print $0}

3.4 Только действие

[root@creditease awk]# awk -F "#" '{print $1}' awk.txt
ABC
BAC
CAB

Обрабатывать все строки по умолчанию

3.5 Несколько режимов и действий

[root@creditease awk]# awk -F "#" 'NR==1{print $NF}NR==3{print $NF}' awk.txt 
GKL$123
GKL$321

3.6 Понимание $0

$0 в awk означает всю строку

[root@creditease awk]# awk '{print $0}' awk_space.txt
ABC DEF GHI GKL$123
BAC DEF GHI GKL$213
CBA DEF GHI GKL$321

3.7 FNR

FNR похож на NR, но многофайловые записи не инкрементируются, а каждый файл начинается с 1 (о многофайловой обработке поговорим позже)

[root@creditease awk]# awk '{print NR}' awk.txt awk_space.txt 
1
2
3
4
5
6
[root@creditease awk]# awk '{print FNR}' awk.txt awk_space.txt 
1
2
3
1
2
3

В-четвертых, регулярные выражения и операторы

Как и sed, awk также может сопоставлять входной текст с помощью сопоставления с образцом. Awk также поддерживает большое количество шаблонов регулярных выражений, большинство из которых похожи на метасимволы, поддерживаемые sed, а регулярные выражения являются важным инструментом для игры в «Трех мушкетеров».

Метасимволы регулярных выражений, поддерживаемые awk

Метасимволы, которые awk не поддерживает по умолчанию, и метасимволы, для поддержки которых требуется добавление параметров.

метасимвол Функции Пример объяснять
x{m} х повторяется m раз /cool{5}/ Следует отметить, что разница между cool со скобками и без скобок, x может составлять строку или только один символ, поэтому /cool{5}/ означает совпадение coo плюс 5 l, то есть coolllll. /(cool){2,}/ означает соответствие coolcool, coolcoolcool и т. д.
x{m,} x повторяется не менее m раз /(cool){2,}/ То же
x{m,n} x повторяется не менее m раз, но не более n раз, необходимо указать параметр: --posix или --re-interval. Этот режим нельзя использовать без этого параметра /(cool){5,6}/ То же

Регулярное использование выражений, по умолчанию - найти подходящую строку в строке, если выполняемая операция выполняется действие, но иногда нужен только фиксированный список соответствует указанному регулярному выражению.

Например:

Я хочу взять пятый столбец (5 долларов) файла /etc/passwd, чтобы найти строку, соответствующую почтовой строке, поэтому мне нужно использовать еще два соответствующих оператора. И в awk есть только эти два оператора для соответствия регулярным выражениям.

Оператор обычного матча
~ Выражения, используемые для сопоставления записей или диапазонов.
! ~ Используется для выражения противоположности ~.

4.1 Обычный пример

1) Показать столбец GHI в awk.txt

[root@creditease awk]# cat awk.txt 
ABC#DEF#GHI#GKL$123
BAC#DEF#GHI#GKL$213
CBA#DEF#GHI#GKL$321
[root@creditease awk]# awk -F "#" '{print $3}' awk.txt 
GHI
GHI
GHI
[root@creditease awk]# awk -F "#" '{print $(NF-1)}' awk.txt 
GHI
GHI
GHI

2) Отобразить строку, содержащую 321

[root@creditease awk]# awk '/321/{print $0}' awk.txt 
CBA#DEF#GHI#GKL$321

3) Используйте # в качестве разделителя для отображения строк, первый столбец которых начинается с B или последний столбец которых заканчивается на 1.

[root@creditease awk]# awk -F "#" '$1~/^B/{print $0}$NF~/1$/{print $0}' awk.txt 
BAC#DEF#GHI#GKL$213
CBA#DEF#GHI#GKL$321

4) Используйте # в качестве разделителя для отображения строк, первый столбец которых начинается с B или C.

[root@creditease awk]# awk -F "#" '$1~/^B|^C/{print $0}' awk.txt 
BAC#DEF#GHI#GKL$213
CBA#DEF#GHI#GKL$321
[root@creditease awk]# awk -F "#" '$1~/^[BC]/{print $0}' awk.txt 
BAC#DEF#GHI#GKL$213
CBA#DEF#GHI#GKL$321
[root@creditease awk]# awk -F "#" '$1~/^(B|C)/{print $0}' awk.txt 
BAC#DEF#GHI#GKL$213
CBA#DEF#GHI#GKL$321
[root@creditease awk]# awk -F "#" '$1!~/^A/{print $0}' awk.txt 
BAC#DEF#GHI#GKL$213
CBA#DEF#GHI#GKL$321

5. Выражения сравнения

Awk — это язык программирования, который может делать более сложные суждения.Когда условия верны, awk выполняет соответствующие действия, в основном для вынесения соответствующих суждений в определенной области, например, для печати результатов выше 80 баллов, поэтому необходимо сделать сравнительное суждение. в этом районе.

В следующей таблице перечислены реляционные операторы, которые может использовать awk, которые можно использовать для сравнения числовых строк, а также регулярных выражений.Когда выражение истинно, результат выражения равен 1, в противном случае он равен 0, только выражение true , awk выполняет соответствующее действие.

Реляционные операторы, поддерживаемые awk

оператор значение Пример
< меньше, чем x>y
<= меньше или равно. x<=y
== равный x==y
!= не равно x!=y
>= больше или равно x>=y
> больше, чем x<y

5.1 Примеры выражений сравнения

Показать строки 2,3 файла awk.txt

NR //,//

[root@creditease awk]# awk 'NR==2{print $0}NR==3{print $0}' awk.txt 
BAC#DEF#GHI#GKL$213
CBA#DEF#GHI#GKL$321
[root@creditease awk]# awk 'NR>=1{print $0}' awk.txt 
ABC#DEF#GHI#GKL$123
BAC#DEF#GHI#GKL$213
CBA#DEF#GHI#GKL$321
[root@creditease awk]# awk '/BAC/,/CBA/{print $0}' awk.txt 
BAC#DEF#GHI#GKL$213
CBA#DEF#GHI#GKL$321

Второй модуль awk, переменные и выполнение

Полная схема структуры awk выглядит следующим образом:

1. Начните модуль

Модуль BEGIN выполняется до того, как awk прочитает файл.Режим BEGIN часто используется для изменения значений встроенных переменных ORS, RS, FS, OFS и т. д. Не могу принять ни один входной файл

Во-вторых, встроенные переменные awk (предопределенные переменные)

имя переменной Атрибуты
$0 Текущая запись, целая строка
$1,$2,3....a N-я область текущей записи, разделенная FS.
FS Введите сепаратор области, по умолчанию имеет место пространство. полевой сепаратор
NF Количество регионов в текущей записи равно количеству столбцов. номер поля
NR Количество прочитанных записей, то есть номер строки, начиная с 1. номер записи
RS Введенный разделитель записей по умолчанию представляет собой новую строку. разделитель записей
OFS Разделитель области вывода, который также является пробелом по умолчанию. разделитель выходных записей
FNR Номер прочитанной записи текущего файла, пересчитанный для каждого файла.
FILENAME Имя файла, который в данный момент обрабатывается

Специальное примечание: FS RS поддерживает регулярные выражения

2.1 Первая роль: определить встроенные переменные

[root@creditease awk]# awk 'BEGIN{RS="#"}{print $0}' awk.txt 
ABC
DEF
GHI
GKL$123
BAC
DEF
GHI
GKL$213
CBA
DEF
GHI
GKL$321

2.2 Вторая функция: печать логотипа

[root@creditease awk]# awk 'BEGIN{print "=======start======"}{print $0}' awk.txt 
=======start======
ABC#DEF#GHI#GKL$123
BAC#DEF#GHI#GKL$213
CBA#DEF#GHI#GKL$321

2.3 awk реализует функцию вычисления

 [root@creditease files]# awk 'BEGIN{a=8;b=90;print a+b,a-c,a/b,a%b}'
98 8 0.0888889 8

3. КОНЕЦ модуля

END выполняет модуль END, когда awk прочитал все файлы, что обычно используется для вывода результата (накопление, результат массива). Это также может быть конечная идентификационная информация, аналогичная модулю BEGIN.

3.1 Первая функция: печать логотипа

[root@creditease awk]# awk 'BEGIN{print "=======start======"}{print $0}END{print "=======end======"}' awk.txt
=======start======
ABC#DEF#GHI#GKL$123
BAC#DEF#GHI#GKL$213
CBA#DEF#GHI#GKL$321
=======end======

3.2 Вторая функция: накопление

1) Статистическая пустая строка (/ etc / services file)

grep sed awk

[root@creditease awk]# grep "^$" /etc/services  |wc -l
17
[root@creditease awk]# sed -n '/^$/p' /etc/services |wc -l
17
[root@creditease awk]# awk '/^$/' /etc/services |wc -l
17
[root@creditease awk]# awk '/^$/{i=i+1}END{print i}' /etc/services
17

2) Арифметические задачи

1+2+3...+100=5050, как это выразить с помощью awk?

[root@creditease awk]# seq 100|awk '{i=i+$0}END{print i}'
5050

В-четвертых, оч подробное резюме

1. Может быть только один модуль BEGIN и END, оба BEGIN{}BEGIN{} или END{}END{} неверны.

2. Кто ищет модули, которых может быть несколько.

Пять, краткое описание процесса выполнения awk

процесс реализации awk:

1. Назначение командной строки (-F или -V)

2. Выполнить содержимое режима BEGIN

3. Начать чтение файла

4. Определить, установлено ли условие (закономерность)

  • Если установлено, выполните содержимое соответствующего действия
  • Прочитайте следующую строку, оцените петлю
  • пока не будет прочитан конец последнего файла

5. Наконец, выполните содержимое режима END.

Часть 3: массивы awk и синтаксис

1. awk-массив

1.1 Структура массива

people[police]=110

people[doctor]=120

[root@creditease awk]# awk 'BEGIN{word[0]="credit";word[1]="easy";print word[0],word[1]}'
credit easy
[root@creditease awk]# awk 'BEGIN{word[0]="credit";word[1]="easy";for(i in word)print word[i]}'
credit
easy

1.2 Классификация массивов

сеять Цитата группа: подписаны с номерами
Ассоциативные массивы: индексированные строками

Ассоциативный массив 1.3 awk

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

a  1
b  3
c  2
d  7
b  5
a  3 
g  2
f  6

С $1 в качестве нижнего индекса создайте массив a[$1]=a[$1]+$2 (a[$1]+=$2) и выведите результат с помощью END и цикла for:

[root@creditease awk]# awk '{a[$1]=a[$1]+$2}END{for(i in a)print i,a[i]}' jia.txt 
a 4
b 8
c 2
d 7
f 6
g 2
注意:for(i in a) 循环的顺序不是按照文本内容的顺序来处理的,排序可以在命令后加sort排序

1.4 массив индексов awk

Массив с подпиской по номерам SEQ генерирует числа от 1 до 10, требуя только количество строк

[root@creditease awk]# seq 10|awk '{a[NR]=$0}END{for(i=1;i<=NR;i+=2){print a[i]}}'
1
3
5
7
9

seq генерирует числа 1-10, прося не отображать последние 3 строки файла

[root@creditease awk]# seq 10|awk '{a[NR]=$0}END{for(i=1;i<=NR-3;i++){print a[i]}}'
1
2
3
4
5
6
7
解析:改变i的范围即可,多用于不显示文件的后几行

Боевая дедупликация массива 1.5 awk

а++ и ++а

[root@creditease awk]# awk 'BEGIN{print a++}'
0
[root@creditease awk]# awk 'BEGIN{print ++a}'
1
[root@creditease awk]# awk 'BEGIN{a=1;b=a++;print a,b}'
2 1
[root@creditease awk]# awk 'BEGIN{a=1;b=++a;print a,b}'
2 2

注:

都是 b = a+1

b=a++ 先把 a 的值赋予b,然后 a + 1

b=++a 先执行a+1,然后把a的值赋予b

Дедуплицировать текст ниже Дедуплицировать второй столбец

[root@creditease awk]# cat qc.txt 
2018/10/20   xiaoli     13373305025
2018/10/25   xiaowang   17712215986
2018/11/01   xiaoliu    18615517895 
2018/11/12   xiaoli     13373305025
2018/11/19   xiaozhao   15512013263
2018/11/26   xiaoliu    18615517895
2018/12/01   xiaoma     16965564525
2018/12/09   xiaowang   17712215986
2018/11/24   xiaozhao   15512013263
解法一:
[root@creditease awk]# awk '!a[$2]++' qc.txt 
2018/10/20   xiaoli     13373305025
2018/10/25   xiaowang   17712215986
2018/11/01   xiaoliu    18615517895 
2018/11/19   xiaozhao   15512013263
2018/12/01   xiaoma     16965564525
解析:
!a[$3]++是模式(条件),命令也可写成awk '!
a[$3]=a[$3]+1{print $0}' qc.txt
a[$3]++ ,“++”在后,先取值后加一
!a[$3]=a[$3]+1:是先取a[$3]的值,比较“!a[$3]”是否符合条件(条件非0),后加1
注意:此方法去重后的结果显示的是文本开头开始的所有不重复的行
解法二:
[root@creditease awk]# awk '++a[$2]==1' qc.txt 
2018/10/20   xiaoli     13373305025
2018/10/25   xiaowang   17712215986
2018/11/01   xiaoliu    18615517895 
2018/11/19   xiaozhao   15512013263
2018/12/01   xiaoma     16965564525
解析:
++a[$3]==1是模式(条件),也可写成a[$3]=a[$3]+1==1即只有当条件(a[$3]+1的结果)为1的时候才打印出内容
++a[$3] ,“++”在前,先加一后取值
++a[$3]==1:是先加1,后取a[$3]的值,比较“++a[$3]”是否符合条件(值为1)
注意:此方法去重后的结果显示的是文本开头开始的所有不重复的行
解法三:
[root@creditease awk]# awk '{a[$2]=$0}END{for(i in a){print a[i]}}' qc.txt
2018/11/12   xiaoli     13373305025
2018/11/26   xiaoliu    18615517895
2018/12/01   xiaoma     16965564525
2018/12/09   xiaowang   17712215986
2018/11/24   xiaozhao   15512013263

解析:
注意此方法去重后的结果显示的是文本结尾开始的所有不重复的行

1.6 awk обрабатывает несколько файлов (массив, NR, FNR)

Используйте awk, чтобы взять первый столбец file.txt и второй столбец file1.txt и перенаправить на новый файл new.txt.

[root@creditease awk]# cat file1.txt 
a b
c d
e f
g h
i j
[root@creditease awk]# cat file2.txt 
1 2
3 4
5 6
7 8
9 10
[root@creditease awk]# awk 'NR==FNR{a[FNR]=$1}NR!=FNR{print a[FNR],$2}' file1.txt file2.txt 
a 2
c 4
e 6
g 8
i 10
解析:NR==FNR处理的是第一个文件,NR!=FNR处理的是第二个文件.
注意:当两个文件NR(行数)不同的时候,需要把行数多的放前边.
解决方法:把行数多的文件放前边,行数少的文件放后边.
把输出的结果放入一个新文件new.txt中:
[root@creditease awk]# awk 'NR==FNR{a[FNR]=$1}NR!=FNR{print a[FNR],$2>"new.txt"}' file1.txt file2.txt 
[root@creditease awk]# cat new.txt 
a 2
c 4
e 6
g 8
i 10

1.7 awk анализирует файлы журналов и подсчитывает количество посещенных веб-сайтов.

[root@creditease awk]# cat url.txt 
http://www.baidu.com
http://mp4.video.cn
http://www.qq.com
http://www.listeneasy.com
http://mp3.music.com
http://www.qq.com
http://www.qq.com
http://www.listeneasy.com
http://www.listeneasy.com
http://mp4.video.cn
http://mp3.music.com
http://www.baidu.com
http://www.baidu.com
http://www.baidu.com
http://www.baidu.com
[root@creditease awk]# awk -F "[/]+" '{h[$2]++}END{for(i in h) print i,h[i]}' url.txt
www.qq.com 3
www.baidu.com 5
mp4.video.cn 2
mp3.music.com 2
www.crediteasy.com 3

Во-вторых, простой синтаксис AWK

2.1 Функция sub gsub

Заменить функцию

Формат: sub(r, s, target) gsub(r, s, target)

[root@creditease awk]# cat sub.txt 
ABC DEF AHI GKL$123
BAC DEF AHI GKL$213
CBA DEF GHI GKL$321
[root@creditease awk]# awk '{sub(/A/,"a");print $0}' sub.txt 
aBC DEF AHI GKL$123
BaC DEF AHI GKL$213
CBa DEF GHI GKL$321
[root@creditease awk]# awk '{gsub(/A/,"a");print $0}' sub.txt 
aBC DEF aHI GKL$123
BaC DEF aHI GKL$213
CBa DEF GHI GKL$321
注:sub只会替换行内匹配的第一次内容;相当于sed ‘s###’
	gsub 会替换行内匹配的所有内容;相当于sed ‘s###g’
[root@creditease awk]# awk '{sub(/A/,"a",$1);print $0}' sub.txt 
aBC DEF AHI GKL$123
BaC DEF AHI GKL$213
CBa DEF GHI GKL$321

Упражнение:

0001|20081223efskjfdj|EREADFASDLKJCV
0002|20081208djfksdaa|JDKFJALSDJFsddf
0003|20081208efskjfdj|EREADFASDLKJCV
0004|20081211djfksdaa1234|JDKFJALSDJFsddf
以'|'为分隔, 现要将第二个域字母前的数字去掉,其他地方都不变, 输出为:
0001|efskjfdj|EREADFASDLKJCV
0002|djfksdaa|JDKFJALSDJFsddf
0003|efskjfdj|EREADFASDLKJCV
0004|djfksdaa1234|JDKFJALSDJFsddf

方法:
awk -F '|'  'BEGIN{OFS="|"}{sub(/[0-9]+/,"",$2);print $0}' sub_hm.txt
awk -F '|'  -v OFS="|" '{sub(/[0-9]+/,"",$2);print $0}' sub_hm.txt

2.2 Использование if и slse

содержание:

AA

BC

AA

CB

CC

AA

результат:

AA YES

BC NO YES

AA YES

CB NO YES

CC NO YES

AA YES

1) [root@creditease awk]# awk '{if($0~/AA/){print $0" YES"}else{print $0" NO YES"}}' ifelse.txt 
AA YES
BC NO YES
AA YES
CB NO YES
CC NO YES
AA YES
解析:使用if和else,if $0匹配到AA,则打印$0 "YES",else反之打印$0 " NO YES"。
2)[root@creditease awk]# awk '$0~/AA/{print $0" YES"}$0!~/AA/{print $0" NO YES"}' ifelse.txt 
AA YES
BC NO YES
AA YES
CB NO YES
CC NO YES
AA YES
解析:使用正则匹配,当$0匹配AA时,打印出YES,反之,打印出“NO YES”

2.3 следующее использование

Как указано выше, используйте next для достижения

следующий : пропустить весь код после него

 [root@creditease awk]# awk '$0~/AA/{print $0" YES";next}{print $0" NO YES"}' ifelse.txt 
AA YES
BC NO YES
AA YES
CB NO YES
CC NO YES
AA YES
解析:
{print $0" NO YES"}:此动作是默认执行的,当前边的$0~/AA/匹配,就会执行{print $0" YES";next}
因为action中有next,所以会跳过后边的action。
如果符合$0~/AA/则打印YES ,遇到next后,后边的动作不执行;如果不符合$0~/AA/,会执行next后边的动作;
next前边的(模式匹配),后边的就不执行,前边的不执行(模式不匹配),后边的就执行。

2.4 printf не переносит вывод и следующее использование

printf : не переносить после печати

Следующий текст, если Описание: пусто, вставьте следующую строку в эту строку.

Packages: Hello-1
Owner: me me me me
Other: who care?
Description:
Hello world!
Other2: don't care
想要结果:
Packages: Hello-1
Owner: me me me me
Other: who care?
Description: Hello world!
Origial-Owner: me me me me
Other2: don't care
1)[root@creditease awk]# awk '/^Desc.*:$/{printf $0}!/Desc.*:$/{print $0}' printf.txt 
Packages: Hello-1
Owner: me me me me
Other: who care?
Description:Hello world!
Other2: don't care
解析:使用正则匹配,匹配到'/^Desc.*:$/,就使用printf打印(不换行),不匹配的打印出整行。
2)使用if和else实现
[root@creditease awk]# awk '{if(/Des.*:$/){printf $0}else{print $0}}' printf.txt 
Packages: Hello-1
Owner: me me me me
Other: who care?
Description:Hello world!
Other2: don't care
3)使用next实现
[root@creditease awk]# awk '/Desc.*:$/{printf $0;next}{print $0}' printf.txt 
Packages: Hello-1
Owner: me me me me
Other: who care?
Description:Hello world!
Other2: don't care
注:可简写成awk '/Desc.*:$/{printf $0;next}1'
printf.txt  ## 1是pattern(模式),默认action(动作)是{print $0}

2.5 После дедупликации, счет перенаправляется в указанный файл по мере необходимости

Текст следующий, требуется посчитать количество повторов каждого пункта, а затем в файл gt2.txt занести повторы больше 2, а в файл le2.txt прописать повторы меньше или равные 2

[root@creditease files]# cat qcjs.txt 
aaa
bbb
ccc
aaa
ddd
bbb
rrr
ttt
ccc
eee
ddd
rrr
bbb
rrr
bbb
[root@creditease awk]# awk '{a[$1]++}END{for(i in a){if(a[i]>2){print i,a[i]>"gt2.txt"}else{print i,a[i]>"le2.txt"}}}' qcjs.txt 
[root@creditease awk]# cat gt2.txt 
rrr 3
bbb 4
[root@creditease awk]# cat le2.txt 
aaa 2
ccc 2
eee 1
ttt 1
ddd 2
解析:{print },或括号中打印后可直接重定向到一个新文件,文件名用双引号引起来。如: {print $1 >"xin.txt"}

Три, awk требует внимания

a) NR==FNR ##Не может быть записано как NR=FNR (=значение присваивания в awk)

б) NR!=FNR ##NR не равно FNR

c){a=1;a[NR]} Это сообщит об ошибке: имена переменных и массивов не могут повторяться в одной и той же команде г) вывод printf не переносится

e){print} или после печати в круглых скобках его можно перенаправить прямо в новый файл, а имя файла заключить в двойные кавычки. Например: {print $1 >"xin.txt"}

f) Когда режим (условие) равен 0, следующие действия не выполняются, ! Когда он равен 0, выполняются следующие действия.

Автор: Цинь Вэй

Источник: Технологический институт CreditEase.