Используя bash (sed/awk) для извлечения строк И столбцов в CSV файлах?

Может ли bash обрабатывать извлечение строк и столбцов из файлов csv? Надеюсь, мне не нужно прибегать к питону.

Мой 5-столбцовый файл csv выглядит так:

Rank,Name,School,Major,Year
1,John,Harvard,Computer Science,3
2,Bill,Yale,Political Science,4
3,Mark,Stanford,Biology,1
4,Jane,Princeton,Electrical Engineering,3
5,Alex,MIT,Management Economics,2

Я хочу только извлечь содержимое 3-го, 4-го и 5-го столбцов, игнорируя первую строку, поэтому вывод выглядит следующим образом:

Harvard,Computer Science,3
Yale,Political Science,4
Stanford,Biology,1
Princeton,Electrical Engineering,3
MIT,Management Economics,2

До сих пор я могу получить awk только для каждой строки или каждого столбца моего CSV файла, но не для конкретных cols/rows, подобных этому случаю! Может ли bash сделать это?

Ответ 1

Bash решения;

Использование IFS

#!/bin/bash
while IFS=',' read -r rank name school major year; do
    echo -e "Rank\t: $rank\nName\t: $name\nSchool\t: $school\nMajor\t: $major\nYear\t: $year\n"
done < file.csv
IFS=$' \t\n'

Использование Манипуляции строк и массивов

#!/bin/bash
declare -a arr
while read -r line; do
    arr=(${line//,/ })
    printf "Rank\t: %s\nName\t: %s\nSchool\t: %s\nMajor\t: %s\nYear\t: %s\n" ${arr[@]}
done < file.csv

Ответ 2

awk -F, 'NR > 1 { print $3 "," $4 "," $5 }' 

NR - это номер текущей строки, а $3, $4 и $5 - поля, разделенные строкой, заданной для -F

Ответ 3

Попробуйте следующее:

tail -n+2 file.csv | cut --delimiter=, -f3-5

Ответ 4

Используйте cut и tail:

tail -n +2 file.txt | cut -d ',' -f 3-

Ответ 5

sed 1d file.csv | while IFS=, read first second rest; do echo "$rest"; done

Ответ 6

Вот вы, простая программа AWK.

#!/usr/bin/awk -f

BEGIN {
    # set field separator to comma to split CSV fields
    FS = ","
}

# NR > 1 skips the first line
NR > 1 {
    # print only the desired fields
    printf("%s,%s,%s\n", $3, $4, $5)
}

Ответ 7

perl -F, -lane 'if($.!=1){print join ",",@F[2,3,4];}' your_file

проверить здесь

Ответ 8

Это может сработать для вас (GNU sed):

sed -r '1d;s/([^,]*,){2}//' file

Ответ 9

попробуйте это

awk -F, 'NR > 1 { OFS=",";print $3, $4, $5 }' temp.txt

или

sed -re '1d;s/^[0-9],\w+,//g' temp.txt

Ответ 10

Я создал пакет для таких задач - gumba Если вы чувствуете себя комфортно с coffeescript, вы можете попробовать попробовать

cat file.csv | tail -n +2 | \
gumba "words(',').take((words)-> words.last(3)).join(',')"`

Ответ 11

grep '^,' outlook.contacts.csv | sed 's/^,\([^,]*\),[^,]*,\([^,]*\),.*/\1 \2/'

Получите все строки, начинающиеся с ,, затем используя sed, чтобы заменить пустые поля первым и вторым именем.

Будьте осторожны по какой-то причине, как только вы вставляете ее, она меняет линию на это, поэтому, возможно, вам стоит осторожно сделать это вручную.

grep '^,' outlook.contacts.csv | sed 's/^,([^,]),[^,],([^,]),./\1 \2/'