2017-03-11 9 views
2

私は大(最大4GB)セミコロン区切りファイル(1.txt)があります。バッシュソートCSV大きなファイルと出力ファイルを分離するためにソート

- "3321";"<a href='/files/goods/edit/647/'><u>[ID 647]</u></a> Шорты";"2015-09-06 18:39:17";"1590";"1";"500";"";"Лейла";"878785";"Да";"80.140.1.38" 
- "2780";"<a href='/files/goods/edit/647/'><u>[ID 647]</u></a> Шорты";"2015-09-06 18:42:51";"1590";"1";"500";"";"Мара";"8664456";"Да";"46.00.00.2" 
- "3352";"<a href='/files/goods/edit/698/'><u>[ID 698]</u></a> Deck";"2015-09-06 19:05:42";"990";"1";"400";"";"Ed";"456452";"Нет";"80.26.00.00" 
- "3764";"<a href='/files/goods/edit/669/'><u>[ID 669]</u></a> Fish";"2015-09-06 18:36:18";"1390";"1";"530";"";"Ann";"545566";"Нет";"80.00.35.90" 
- "3323";"<a href='/files/goods/edit/669/'><u>[ID 669]</u></a> Fish";"2015-09-06 18:54:18";"1390";"1";"530";"";"юрий";"99393";"Да";"85.141.00.100" 
- "32763";"<a href='/files/goods/edit/430/'><u>[ID 430]</u></a> Radio";"2015-09-06 

私は2番目の列と出力によってはファイルを分離するために、すべての結果でソート1.txt必要が2番目の列名に。

私はこれを行う:

sed -r -i -e 's#"<a href=\x27\/files\/goods\/edit\/##g' 1.txt | sed -r -i -e 's#\/\x27>#;#g' 1.txt | sort --field-separator=';' --key=2 1.txt 

しかし、どのように今1.txtファイルを分割し、ファイルを分離して、ファイル内のレコードをカウントするために、すべて同じID(第2列)値のラインを入れて? 647_count.txtのようにするには、698_count.txt,669_count.txt430_count.txtがあります。

+0

647_count.txtには何も含まれていません。その方法を知らないので –

+0

私は内容ではなくファイル名を意味しました。ファイル名に 'ID'値が含まれていますか? – RomanPerekhrest

答えて

2

次のことを試してみてくださいawkスクリプト(のはparser.awkそれを呼びましょう):

BEGIN { FS=";"; } # field separator 
{ 
    if (match($2, /[0-9]+/)) {   # matching `ID` value 
     m=substr($2, RSTART, RLENGTH); 
     a[m]++;       # accumulating number of lines for each `ID` 
     print > m"_count.txt"; # writing lines pertaining to certain `ID` into respective file 
    } 
} 
END { 
    for(i in a) { 
     print "mv "i"_count.txt "i"_"a[i]".txt" # renaming files with actual counts 
    } 
} 

使用法:

awk -f parser.awk 1.csv | sh 

あなたは、私は次のように求めてきた質問に投稿した入力フラグメントについてファイルの一覧:

430_1.txt 
647_2.txt 
669_2.txt 
698_1.txt 
2

バッシュ:

err() { echo "[email protected]" >&2; return 1; } 

#the line sorting 
re='^[^;]*;[^;]*ID ([0-9][0-9]*)' 
n=0 
while read -r line 
do 
    let n++ 
    if [[ "$line" =~ $re ]] 
    then 
     echo "$line" >> "${BASH_REMATCH[1]}_COUNT.csv" 
    else 
     err "$n-th line [$line] doesn't match" 
    fi 

done 

#rename the ID_COUNT.csv to the real value of lines 
shopt -s nullglob 
for file in [0-9][0-9]*_COUNT.csv 
do 
    mv -n "$file" "${file//_COUNT/_$(grep -c '^' "$file")}" 
done 
関連する問題