Управлять (исключать строки) определенным столбцом файла .csv, используя UNIX / Linux - PullRequest
0 голосов
/ 31 октября 2019

Я хочу получить доступ к четвертому столбцу файла CSV и манипулировать им. В частности, я хочу исключить строки, которые не соответствуют определенным требованиям (исключить строки, которые не имеют трехзначного кода страны).

Мой набор данных:

Luxembourg,LUX,2017,9294689.12
Aruba,ABW,2017,927865.82
Nepal,NPL,2017,9028196.37
Bangladesh,BGD,2017,88057460.51
Costa Rica,CRI,2017,8695008.05
Chile,CHL,2017,84603249.72
Cook Islands,COK,2017,82045.41
World,OWIDWRL,1755,9361520
India,INDIA,1763,0
Asia and Pacific (other),,2017,5071156099
World,OWID_WRL,1752,9354192
Middle East,,1751,0
International transport,,1751,0
India,IND,1751,0
Europe (other),,1751,0
China,CHN,1751,0
Asia and Pacific (other),,1751,0
Americas (other),,1751,0
Africa,,1751,0

Заранее спасибо.

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

Ожидаемый набор данных:

Luxembourg,LUX,2017,9294689.12
Aruba,ABW,2017,927865.82
Nepal,NPL,2017,9028196.37
Bangladesh,BGD,2017,88057460.51
Costa Rica,CRI,2017,8695008.05
Chile,CHL,2017,84603249.72
Cook Islands,COK,2017,82045.41

Ответы [ 2 ]

1 голос
/ 31 октября 2019

Приведенное ниже будет выводить только строки с трехбуквенным значением во втором поле:

awk --re-interval -F, 'tolower($2) ~ /^[a-z]{3}$/' country.txt

Проверка длины также возможна, но это обеспечивает только 3 буквы.

--re-internval позволяет использовать выражения itnernval в RE, поскольку фигурные скобки являются зарезервированными символами в awk.

-F, сообщает awk, что вводимый разделитель - запятая.

print - это действие по умолчанию в awk, поэтому tolower($2) ~ /^[a-z]{3}$/ - это краткий способ сказать tolower($2) ~ /^[a-z]{3}$/ {print}

* tolower($2) - это значение второго поля в нижнем регистре, а ~ - оператор сравнения регулярных выражений,который мы используем для проверки начала строки ^, затем [a-z] повторения {3} раз и конца строки $.

1 голос
/ 31 октября 2019

Если я правильно понял ваш вопрос, не могли бы вы попробовать. Если код выглядит, если во 2-м поле любой строки НЕ содержится точных 3 символов, НЕ печатайте эту строку.

awk 'BEGIN{FS=","} $2~/^[a-zA-Z]{3}$/' Input_file

Если у вас OLD awk, где диапазон {3} не работаетпопытка.

awk 'BEGIN{FS=","} $2~/^[a-zA-Z][a-zA-Z][a-zA-Z]$/' Input_file


Объяснение: Добавление пояснения к приведенному выше коду здесь.

awk '                  ##Starting awk program here.
BEGIN{                 ##Starting BEGIN section from here. Which will be executed before Input_file is being read
  FS=","               ##Setting field separator as comma here.
}                      ##Closing BEGIN section here.
$2~/^[a-zA-Z]{3}$/     ##Checking condition if 2nd field is starting with alphabets 3 occurrence of it and ending with it too.
                       ##Since awk works on method of condition then action; so if condition is TRUE then perform certain action.
                       ##In this case no action given so  by default print of line will happen.
' Input_file           ##Mentioning Input_file name here.
...