Есть ли заклинание командной строки для сохранения определенных столбцов по имени в CSV-файле?

Предположим, у меня есть сумасшедший набор данных в CSV:

SOS_VOTERID,COUNTY_NUMBER,COUNTY_ID,LAST_NAME,FIRST_NAME,MIDDLE_NAME,SUFFIX,DATE_OF_BIRTH,REGISTRATION_DATE,PARTY_AFFILIATION,RESIDENTIAL_ADDRESS1,RESIDENTIAL_SECONDARY_ADDR,city,RESIDENTIAL_STATE,zip,RESIDENTIAL_ZIP_PLUS4,RESIDENTIAL_COUNTRY,RESIDENTIAL_POSTALCODE,MAILING_ADDRESS1,MAILING_SECONDARY_ADDRESS,MAILING_CITY,MAILING_STATE,MAILING_ZIP,MAILING_ZIP_PLUS4,MAILING_COUNTRY,MAILING_POSTAL_CODE,CAREER_CENTER,CITY,CITY_SCHOOL_DISTRICT,COUNTY_COURT_DISTRICT,CONGRESSIONAL_DISTRICT,COURT_OF_APPEALS,EDUCATIONAL_SERVICE_CENTER_DISTRICT,EXEMPTED_VILLAGE_SCHOOL_DISTRICT,LIBRARY,LOCAL_SCHOOL_DISTRICT,MUNICIPAL_COURT_DISTRICT,PRECINCT_NAME,PRECINCT_CODE,STATE_BOARD_OF_EDUCATION,STATE_REPRESENTATIVE_DISTRICT,STATE_SENATE_DISTRICT,TOWNSHIP,VILLAGE,WARD,PRIMARY-03/07/2000,GENERAL-11/07/2000,SPECIAL-05/08/2001,GENERAL-11/06/2001,PRIMARY-05/07/2002,GENERAL-11/05/2002,SPECIAL-05/06/2003,GENERAL-11/04/2003,PRIMARY-03/02/2004,GENERAL-11/02/2004,SPECIAL-02/08/2005,PRIMARY-05/03/2005,PRIMARY-09/13/2005,GENERAL-11/08/2005,SPECIAL-02/07/2006,PRIMARY-05/02/2006,GENERAL-11/07/2006,PRIMARY-05/08/2007,PRIMARY-09/11/2007,GENERAL-11/06/2007,PRIMARY-11/06/2007,GENERAL-12/11/2007,PRIMARY-03/04/2008,PRIMARY-10/14/2008,GENERAL-11/04/2008,GENERAL-11/18/2008,PRIMARY-05/05/2009,PRIMARY-09/08/2009,PRIMARY-09/15/2009,PRIMARY-09/29/2009,GENERAL-11/03/2009,PRIMARY-05/04/2010,PRIMARY-07/13/2010,PRIMARY-09/07/2010,GENERAL-11/02/2010,PRIMARY-05/03/2011,PRIMARY-09/13/2011,GENERAL-11/08/2011,PRIMARY-03/06/2012,GENERAL-11/06/2012,PRIMARY-05/07/2013,PRIMARY-09/10/2013,PRIMARY-10/01/2013,GENERAL-11/05/2013,PRIMARY-05/06/2014,GENERAL-11/04/2014,PRIMARY-05/05/2015 OH0012781511,87,26953,HOUSEHOLDER,SHERRY,LEIGH,,11/26/1965,08/19/1988,,211 N GARFIELD ST , ,BLOOMDALE,OH,44817,,,, PO BOX 222 , ,BLOOMDALE,OH,44817,,,,PENTA JVSD,,,,05,06,WOOD EDUC SRV CTR,,,ELMWOOD LOCAL SD,BOWLING-GREEN,BLOOM TWP BLOOMDALE,87-P-ABO,02,03,02,,BLOOMDALE VILLAGE,,D,,,X,,X,,,,X,,,,,,,,,,,,,D,,X,,,,,,X,,,,,,,,,X,,,,,,, OH0012781528,87,31122,KEATON,JENNIFER,KAI,,11/27/1968,07/13/2015,,110 N GARFIELD ST , ,BLOOMDALE,OH,44817,,,, PO BOX 16 , ,BLOOMDALE,OH,44817,,,,PENTA JVSD,,,,05,06,WOOD EDUC SRV CTR,,,ELMWOOD LOCAL SD,BOWLING-GREEN,BLOOM TWP BLOOMDALE,87-P-ABO,02,03,02,,BLOOMDALE VILLAGE,,,X,,,,,,,,X,,,,,,,,,,,,,,,X,,,,,,X,,,,,,,X,,X,,,,,,, 

И я хочу только сохранить город и почтовые столбцы; Есть ли простое заклинание командной строки, что я могу указать два имени в качестве аргументов и сохранить только эти два столбца в новом CSV-файле?

2 Solutions collect form web for “Есть ли заклинание командной строки для сохранения определенных столбцов по имени в CSV-файле?”

Если у вас есть простые столбцы, разделенные запятыми, вы можете сделать это с помощью awk. Разберите первую строку, чтобы определить нужные столбцы, а затем распечатайте эти столбцы.

 wanted_columns=city,zip wanted_columns=",$wanted_columns," awk -F, ' NR==1 { for (i=1; i<=NF; i++) { if (index(ENVIRON["wanted_columns"], ","$i",")) {last=i; columns[i]=","} columns[last]="\n" } } { for (i=1; i<=NF; i++) { if (columns[i]) printf "%s%s", $i, columns[i] } }' 

Кроме того, вы можете использовать cut ; это будет быстрее, если файл большой. Сначала проанализируйте строку заголовка различными инструментами, чтобы определить номера столбцов.

 wanted_columns=city,zip { IFS= read header; cut_spec=$(printf %s "$header" | wanted_columns=",$wanted_columns," awk -v RS=, ' index(ENVIRON["wanted_columns"], ","$0",") {printf "%d,", NR}' ); { printf %s\\n "$header"; cat; } | cut -d , -f "${cut_spec%,}"; } 

Если ваш CSV-файл является фактическим CSV-файлом с некоторыми цитированными столбцами, которые могут иметь встроенные столбцы или новые строки, используйте соответствующий инструмент CSV. Например, в Python :

 #!/usr/bin/env python2 import csv, sys wanted_columns = set(sys.argv[1:]) reader = csv.reader(sys.stdin) header = reader.next() columns = [i for i in range(len(header)) if header[i] in wanted_columns] writer=csv.writer(sys.stdout) writer.writerow(sys.argv[1:]) for row in reader: writer.writerow([row[i] for i in columns]) 

(Передайте нужные имена столбцов в качестве аргументов сценария.)

Если у вас нет встроенного (означает нет ...,"foo,bar",... ), вы можете использовать cut :

 cut -d, -f13,15 

выбирает только столбцы 13 и 15, где столбцы разделены символом. Почему столбцы 13 и 15 правильные? Я подсчитал запятые с

 head -n 1 data.csv | sed 's/zip,.*/,/' | tr -dc , | wc -c 

Объяснение: возьмите первую строку ввода ( head ), найдите «zip» и замените ее, а остальную часть строки запятой ( sed ), а затем выбросите все, что не является запятой ( tr ) и count ( wc ). Поэтому «a, zip, b» преобразуется в «a», «to», «2.» zip »- это второе поле.

  • соответствие шаблону grep
  • Bash: разбить список файлов на разные файлы?
  • Почему «bash -x» нарушает этот скрипт?
  • Сценарий Bash с ssh, не возвращающим значение переменных
  • Дождитесь завершения процесса, прежде чем перейти к следующей строке в сценарии оболочки
  • строка в файле как переменная
  • Как изменить переменную, которая является частью значения другой переменной
  • Копировать только Конкретный текст файла в другой
  • Используйте sed и sed самостоятельно, чтобы выполнить подстановку в строке, начинающейся с определенной строки, только если!
  • Как сохранить статус последнего выхода после теста
  • Сценарий оболочки для увеличения количества записей
  • Interesting Posts

    KDE5 После возобновления приостановления я повредил ярлыки под значками

    Последовательная поддержка Grub и usb

    Как сделать определенные сервисы зависимыми от определенных интерфейсов?

    Как установить unetbootin на процессор E1 Vision AMD?

    Solaris: как пересылать электронные письма cron?

    Где хранятся программные вызовы процесса загрузки

    Могут ли два USB-устройства RNDIS с тем же IP-соединением подключаться к серверам VNC одного компьютера?

    Как объединить два файла с общим ключом в awk?

    sed: исключая строки серверной части из сопоставленного шаблона

    lftp: войти, поместить файл в удаленный каталог и выйти из одной команды: правильная цитата

    Возьмите входные аргументы и передайте их на сегодняшний день

    Как преобразование сырых мышей в контент / dev / input / mice?

    Лучший способ создания RAID на существующем системном диске

    Вход не chdir () для исправления домашнего каталога (AD / realmd / sssd)

    ssh-agent: как настроить его, чтобы мой CentOS-сервер запрашивал только парольную фразу?

    Linux и Unix - лучшая ОС в мире.