web-dev-qa-db-ja.com

bash(sed / awk)を使用してCSVファイルの行と列を抽出しますか?

Bashはcsvファイルからの行と列の抽出を処理できますか? Pythonに頼る必要がないことを願っています。

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はこれを行うことができますか?

14
user1899415

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

NRは現在の行番号、$ 3、$ 4、$ 5は-Fに指定された文字列で区切られたフィールドです

17
that other guy

これを試して:

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

cutおよび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

これを試して

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

またはこれ

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

これはあなたのために働くかもしれません(GNU sed):

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

チェック ここ

2
Vijay

さあ、簡単な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)
}
2
steveha

私はこの種のタスク用のパッケージを作成しました- gumba coffeescriptに慣れているなら、試してみることができます

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

,で始まるすべての行を取得し、次にsedを使用して空白のフィールドを1番目と2番目の名前で置き換えます。

貼り付けたら何らかの理由で注意してください。行がこれに変わりますので、手動で慎重に行うことをお勧めします。

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