Как игнорировать какие-либо конкретные данные столбца из CSV-файла с помощью Linux Cli? - PullRequest
0 голосов
/ 10 мая 2018

У меня есть 9 столбцов, таких как c1 c2 c3 c4 c5 c6 c7 c8 c9, и я хочу определить значение c1 c2 c3 c4 c5 and c9.

.

Столбцы имеют следующие данные в формате CSV. Как я могу сделать это в Linux с помощью CLI? Пожалуйста, помогите

Пример данных

123,B006195,T,O,INDIVIDUAL,25^5820200^,2018-04-25,13,NEW
12,C06195,T,O,INDIVIDUAL,25^5820200^,2018-04-25,13,NEW
12345,B00619,T,O,IND,25^5820200^,2018-04-25,13,OLD

Я пытался использовать cat file.csv | awk '{print $1,$2,$3,$4,$5}' > newfile

Ответы [ 2 ]

0 голосов
/ 10 мая 2018

Следующее решение может помочь вам в этом, вам нужно предоставить номера полей в переменной awk с именем fields и вывести ее на печать.

awk -F, -v fields="1,2,3,4,5,9" 'BEGIN{num=split(fields, array,",")} {for(i=1;i<=num;i++){printf("%s%s",$array[i],i==num?ORS:OFS)}}' OFS=,   Input_file

Теперь добавляем не-лайнерную форму решения.

awk -F, -v fields="1,2,3,4,5,9" '
BEGIN{
  num=split(fields, array,",")}
{
  for(i=1;i<=num;i++){
    printf("%s%s",$array[i],i==num?ORS:OFS)}}
' OFS=,   Input_file

Объяснение вышеуказанного кода:

awk -F, -v fields="1,2,3,4,5,9" '              ##Setting field seprator as comma here with -F. Setting variable named fields with values of fields which we need.
BEGIN{                                         ##Starting BEGIN section here for awk which will be executed before reading the Input_file.
  num=split(fields, array,",")}                ##using split to split the variable fields into array named array and creating variable num which will have number of element of array.
{
  for(i=1;i<=num;i++){                         ##Starting a for loop here which starts from variable named i value from 1 to till value of variable num.
    printf("%s%s",$array[i],i==num?ORS:OFS)}}  ##Printing value of array[i] and then $array[i] will print the field value in current line too. Then checking condition variable i value equal to variable num then print new line else print space with OFS.
' OFS=,  Input_file                            ##Mentioning the Input_file name here.
0 голосов
/ 10 мая 2018

Я не уверен, что вы подразумеваете под cat the value of c1 c2 c3 c4 c5 and c9, однако, если вы хотите фильтровать только эти столбцы, вы можете использовать следующую команду awk:

awk 'BEGIN{OFS=FS=","}{print $1,$2,$3,$4,$5,$9}' sample.csv

ВХОД:

more sample.csv 
c1,c2,c3,c4,c5,c6,c7,c8,c9
123,B006195,T,O,INDIVIDUAL,25^5820200^,2018-04-25,13,NEW
12,C06195,T,O,INDIVIDUAL,25^5820200^,2018-04-25,13,NEW
12345,B00619,T,O,IND,25^5820200^,2018-04-25,13,OLD

ВЫВОД:

awk 'BEGIN{OFS=FS=","}{print $1,$2,$3,$4,$5,$9}' sample.csv 
c1,c2,c3,c4,c5,c9
123,B006195,T,O,INDIVIDUAL,NEW
12,C06195,T,O,INDIVIDUAL,NEW
12345,B00619,T,O,IND,OLD

Пояснения:

В качестве разделителя полей (вход, выход) вы определяете , (BEGIN{OFS=FS=","}), а затем просто печатаете для каждой строки столбцы, которые необходимо отобразить {print $1,$2,$3,$4,$5,$9} после перенаправления вывода в новый файл CSV

Если вы считаете, что awk является избыточным для этой задачи, вы также можете просто использовать команду cut (-d',' - для определения , в качестве разделителя, а -f... - для указания, какое поле нужно быть сохраненным):

$ cut -d',' -f1,2,3,4,5,9 sample.csv
c1,c2,c3,c4,c5,c9
123,B006195,T,O,INDIVIDUAL,NEW
12,C06195,T,O,INDIVIDUAL,NEW
12345,B00619,T,O,IND,OLD
...