it-swarm.com.de

verwenden von Bash (sed/awk) zum Extrahieren von Zeilen UND Spalten in CSV-Dateien?

Kann bash Zeilen und Spalten aus CSV-Dateien extrahieren? Ich hoffe, ich muss nicht auf Python zurückgreifen.

Meine 5-Spalten-CSV-Datei sieht folgendermaßen aus:

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

Ich möchte nur den Inhalt der 3., 4. und 5. Spalte extrahieren und dabei die erste Zeile ignorieren. Die Ausgabe sieht also folgendermaßen aus:

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

Bisher kann ich nur awk bekommen, um entweder jede Zeile oder jede Spalte meiner CSV-Datei, aber nicht bestimmte Spalten/Zeilen wie in diesem Fall auszudrucken! Kann Bash dies tun?

13
user1899415

Bash-Lösungen;

IFS verwenden

#!/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'

Verwenden der String-Manipulation und Arrays

#!/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
6
koola
awk -F, 'NR > 1 { print $3 "," $4 "," $5 }' 

NR ist die aktuelle Zeilennummer, während $ 3, $ 4 und $ 5 die Felder sind, die durch die Zeichenfolge getrennt sind, die -F gegeben wird

17
that other guy

Versuche dies:

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

Verwenden Sie cut und tail:

tail -n +2 file.txt | cut -d ',' -f 3-
5
Rubens
sed 1d file.csv | while IFS=, read first second rest; do echo "$rest"; done
3
glenn jackman

versuche dies

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

oder dieses

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

Das könnte für Sie funktionieren (GNU sed):

sed -r '1d;s/([^,]*,){2}//' file
2
potong
Perl -F, -lane 'if($.!=1){print join ",",@F[2,3,4];}' your_file

check hier

2
Vijay

Los geht's, ein einfaches AWK-Programm.

#!/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)
}
2
steveha

Ich habe ein Paket für diese Art von Aufgaben erstellt - gumba Wenn Sie sich mit coffeescript wohl fühlen, können Sie es versuchen

cat file.csv | tail -n +2 | \
gumba "words(',').take((words)-> words.last(3)).join(',')"`
1
welldan97
grep '^,' Outlook.contacts.csv | sed 's/^,\([^,]*\),[^,]*,\([^,]*\),.*/\1 \2/'

Rufen Sie alle Zeilen ab, die mit einem , beginnen, und ersetzen Sie leere Felder durch sed durch den ersten und den zweiten Namen.

Seien Sie vorsichtig, wenn Sie beim Einfügen die Zeile in diese Zeile ändern. Vielleicht sollten Sie sie besser manuell ausführen.

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