আমার কাছে যদি সিএসভি ফাইল থাকে তবে কেবল কোনও একক কলামের বিষয়বস্তু মুদ্রণের জন্য কি দ্রুত বাশ উপায় আছে? এটি ধরে নেওয়া নিরাপদ যে প্রতিটি সারিতে একই সংখ্যক কলাম রয়েছে তবে প্রতিটি কলামের সামগ্রীর দৈর্ঘ্য আলাদা হবে।
আমার কাছে যদি সিএসভি ফাইল থাকে তবে কেবল কোনও একক কলামের বিষয়বস্তু মুদ্রণের জন্য কি দ্রুত বাশ উপায় আছে? এটি ধরে নেওয়া নিরাপদ যে প্রতিটি সারিতে একই সংখ্যক কলাম রয়েছে তবে প্রতিটি কলামের সামগ্রীর দৈর্ঘ্য আলাদা হবে।
উত্তর:
আপনি এর জন্য বিশ্রী ব্যবহার করতে পারেন। আপনি চান নবম কলামে '$ 2' পরিবর্তন করুন।
awk -F "\"*,\"*" '{print $2}' textfile.csv
gawk -F"|" "{print $13}" files*.csv
...,"string,string",...
"
এবং শেষ হবে"
awk -F "\"*;\"*" '{print $2}' textfile.csv
হ্যাঁ. cat mycsv.csv | cut -d ',' -f3
3 য় কলাম প্রিন্ট করা হবে।
awk
এটি করার সহজতম উপায়টি হ'ল csvtool ব্যবহার করা । সিএসভিটিউল ব্যবহার করার জন্য আমার কাছে অন্যান্য ব্যবহারের কেস ছিল এবং এটি কলামের ডেটাতে উপস্থিত হয়ে যদি তা উদ্ধৃত বা ডিলিমিটরগুলিকে যথাযথভাবে পরিচালনা করতে পারে।
csvtool format '%(2)\n' input.csv
2 টি কলামের নম্বর দিয়ে প্রতিস্থাপন করা কার্যকরভাবে আপনার সন্ধান করা কলামের ডেটা বের করবে।
cat input.csv | csvtool formath '%(2)\n' -
নোট যা আমি জানি এখানে বিড়াল অকেজো কিন্তু এটি কোনও কমান্ডের জন্য সাবমাস যা একটি সিএসভি রফতানি করবে sub
format '%(2)\n'
একটি ক্ষেত্র কোথায় শেষ হবে তা কমান্ডটি বলতে পারেনি। (csvtool 1.4.2)
csvtool
ব্যবহার করা দরকার বলে মনে হয় -
।
csvtool format '%(1),%(10)\n' - < in.csv > out.csv
একটি ট্যাব বিচ্ছিন্ন ফাইল থেকে নিষ্কাশন করতে খুঁজছেন এখানে অবতরণ। ভেবেছিলাম আমি যুক্ত করব।
cat textfile.tsv | cut -f2 -s
যেখানে -f2
2, শূন্য-বিহীন সূচকযুক্ত কলাম বা দ্বিতীয় কলামটি বের করে।
cat
অপ্রয়োজনীয়:< textfile.tsv cut -f2 -s
এই প্রশ্নের জন্য অনেক উত্তর দুর্দান্ত এবং কিছু এমনকি কোণার ক্ষেত্রে সন্ধান করেছে। আমি একটি সাধারণ উত্তর যুক্ত করতে চাই যা প্রতিদিনের ব্যবহারের হতে পারে ... যেখানে আপনি বেশিরভাগ ক্ষেত্রে এই কোণার ক্ষেত্রে (যেমন কমাতে বা কমাতে কমাতে পলায়ন ইত্যাদির মধ্যে পড়ে) ইত্যাদি পেতে পারেন)
এফএস (ফিল্ড বিভাজক) হল এমন পরিবর্তনশীল যার মানটি স্থানকে স্থানান্তরিত করে। তাই কোনও লাইনের জন্য স্পেসে ডিফল্টভাবে বিভক্ত হয়ে যায়।
তাই শুরু করুন (ইনপুট নেওয়ার আগে এক্সিকিউট করুন) আমরা এই ফিল্ডটিকে আমাদের যে কোনও কিছুতে সেট করতে পারি ...
awk 'BEGIN {FS = ","}; {print $3}'
উপরের কোডটি CSV ফাইলে তৃতীয় কলামটি প্রিন্ট করবে।
অন্যান্য উত্তরগুলি ভাল কাজ করে, তবে যেহেতু আপনি কেবল বাশ শেল ব্যবহার করে সমাধান চেয়েছিলেন, আপনি এটি করতে পারেন:
AirBoxOmega:~ d$ cat > file #First we'll create a basic CSV
a,b,c,d,e,f,g,h,i,k
1,2,3,4,5,6,7,8,9,10
a,b,c,d,e,f,g,h,i,k
1,2,3,4,5,6,7,8,9,10
a,b,c,d,e,f,g,h,i,k
1,2,3,4,5,6,7,8,9,10
a,b,c,d,e,f,g,h,i,k
1,2,3,4,5,6,7,8,9,10
a,b,c,d,e,f,g,h,i,k
1,2,3,4,5,6,7,8,9,10
a,b,c,d,e,f,g,h,i,k
1,2,3,4,5,6,7,8,9,10
এবং তারপরে আপনি কলামগুলি (এই উদাহরণের মধ্যে প্রথমটি) এর মতো করে বের করতে পারেন:
AirBoxOmega:~ d$ while IFS=, read -a csv_line;do echo "${csv_line[0]}";done < file
a
1
a
1
a
1
a
1
a
1
a
1
সুতরাং এখানে বেশ কয়েকটি জিনিস চলছে:
while IFS=,
- এটি আইএফএস (অভ্যন্তরীণ ক্ষেত্র বিভাজক) হিসাবে কমা ব্যবহার করতে বলছে, যা শেলটি ক্ষেত্রগুলি (পাঠ্যের ব্লকগুলি) পৃথক করে তা জানতে ব্যবহৃত হয়। সুতরাং আইএফএস = বলা, "ক, খ" বলা সমান "আই বি" এর মতই যদি আইএফএস = "" হয় (যা এটি ডিফল্টরূপে হয়))
read -a csv_line;
- এটি প্রতিটি লাইনে একবারে পড়ার কথা বলছে এবং একটি অ্যারে তৈরি করবে যেখানে প্রতিটি উপাদানকে "csv_line" বলা হয় এবং এটি আমাদের লুপের "কর" বিভাগে প্রেরণ করুন
do echo "${csv_line[0]}";done < file
- এখন আমরা "কর" পর্যায়ে এসেছি এবং আমরা অ্যারে "csv_line" এর 0 ম উপাদানটি প্রতিধ্বনিত করছি। এই ক্রিয়াটি ফাইলের প্রতিটি লাইনে পুনরাবৃত্তি হয়। < file
অংশ মাত্র যেখানে থেকে পড়তে যখন লুপ কহন হয়। দ্রষ্টব্য: মনে রাখবেন, ব্যাশে, অ্যারেগুলি 0 টি সূচকযুক্ত, তাই প্রথম কলামটি 0 তম উপাদান।
সুতরাং সেখানে আপনার এটি রয়েছে, শেলের সিএসভি থেকে একটি কলাম বের করছে। অন্যান্য সমাধানগুলি সম্ভবত আরও ব্যবহারিক, তবে এটি খাঁটি বাশ b
আপনি জিএনইউ আওক ব্যবহার করতে পারেন, ব্যবহারকারীর নির্দেশিকার এই নিবন্ধটি দেখুন । নিবন্ধে উপস্থাপিত সমাধানটির উন্নতি হিসাবে (জুন ২০১৫), নিম্নলিখিত গাউক কমান্ডটি ডাবল উদ্ধৃত ক্ষেত্রগুলির মধ্যে ডাবল উদ্ধৃতিগুলিকে অনুমতি দেয়; একটি ডাবল উদ্ধৃতি সেখানে টানা দুটি ডাবল উদ্ধৃতি ("") দ্বারা চিহ্নিত করা হয়েছে। তদ্ব্যতীত, এটি খালি ক্ষেত্রের অনুমতি দেয়, তবে এটি মাল্টলাইন ক্ষেত্রগুলি পরিচালনা করতে পারে না । নিম্নলিখিত উদাহরণটি c=3
টেক্সটফিল.সিএসভি- র তৃতীয় কলামটি (মাধ্যমে ) মুদ্রণ করে:
#!/bin/bash
gawk -- '
BEGIN{
FPAT="([^,\"]*)|(\"((\"\")*[^\"]*)*\")"
}
{
if (substr($c, 1, 1) == "\"") {
$c = substr($c, 2, length($c) - 2) # Get the text within the two quotes
gsub("\"\"", "\"", $c) # Normalize double quotes
}
print $c
}
' c=3 < <(dos2unix <textfile.csv)
dos2unix
সম্ভাব্য ডস স্টাইল লাইন ব্রেক (সিআরএলএফ অর্থাত "\ r \ n") এবং ইউটিএফ -16 এনকোডিং (বাইট অর্ডার চিহ্ন সহ) যথাক্রমে "\ n" এবং ইউটিএফ -8 (বাইট অর্ডার চিহ্ন ছাড়াই) রূপান্তর করার ব্যবহারটি লক্ষ্য করুন । স্ট্যান্ডার্ড সিএসভি ফাইলগুলি লাইন ব্রেক হিসাবে CRLF ব্যবহার করে, উইকিপিডিয়া দেখুন ।
যদি ইনপুটটিতে একাধিক ক্ষেত্র থাকতে পারে তবে আপনি নিম্নলিখিত স্ক্রিপ্টটি ব্যবহার করতে পারেন। আউটপুটে রেকর্ডগুলি পৃথক করার জন্য বিশেষ স্ট্রিংয়ের ব্যবহারটি নোট করুন (যেহেতু ডিফল্ট বিভাজক নতুন লাইনটি কোনও রেকর্ডের মধ্যে আসতে পারে)। আবার, নিম্নলিখিত উদাহরণটি c=3
textfile.csv এর তৃতীয় কলামটি (মাধ্যমে ) মুদ্রণ করে:
#!/bin/bash
gawk -- '
BEGIN{
RS="\0" # Read the whole input file as one record;
# assume there is no null character in input.
FS="" # Suppose this setting eases internal splitting work.
ORS="\n####\n" # Use a special output separator to show borders of a record.
}
{
nof=patsplit($0, a, /([^,"\n]*)|("(("")*[^"]*)*")/, seps)
field=0;
for (i=1; i<=nof; i++){
field++
if (field==c) {
if (substr(a[i], 1, 1) == "\"") {
a[i] = substr(a[i], 2, length(a[i]) - 2) # Get the text within
# the two quotes.
gsub(/""/, "\"", a[i]) # Normalize double quotes.
}
print a[i]
}
if (seps[i]!=",") field=0
}
}
' c=3 < <(dos2unix <textfile.csv)
সমস্যাটির আরও একটি পন্থা রয়েছে। CSvquote একটি CSV ফাইলের সামগ্রীগুলি পরিবর্তিত করতে পারে যাতে ক্ষেত্রের মধ্যে বিশেষ অক্ষরগুলি রুপান্তরিত হয় যাতে সাধারণ ইউনিক্স পাঠ্য প্রক্রিয়াকরণ সরঞ্জামগুলি নির্দিষ্ট কলামটি নির্বাচন করতে ব্যবহার করতে পারে। উদাহরণস্বরূপ নিম্নলিখিত কোডটি তৃতীয় কলামটি আউটপুট করে:
csvquote textfile.csv | cut -d ',' -f 3 | csvquote -u
csvquote
বড় আকারের ফাইলগুলি প্রক্রিয়াজাতকরণে ব্যবহার করা যেতে পারে।
এখানে 2 কলাম সহ সিএসভি ফাইলের উদাহরণ রয়েছে
myTooth.csv
Date,Tooth
2017-01-25,wisdom
2017-02-19,canine
2017-02-24,canine
2017-02-28,wisdom
প্রথম কলামটি পেতে, ব্যবহার করুন:
cut -d, -f1 myTooth.csv
f এর অর্থ ক্ষেত্র এবং d ডিলিমিটার
উপরের কমান্ডটি চালনা করলে নিম্নলিখিত আউটপুট তৈরি হবে।
আউটপুট
Date
2017-01-25
2017-02-19
2017-02-24
2017-02-28
শুধুমাত্র দ্বিতীয় কলামটি পেতে:
cut -d, -f2 myTooth.csv
এবং এখানে আউটপুট আউটপুট
Tooth
wisdom
canine
canine
wisdom
incisor
আরেকটি ব্যবহারের কেস:
আপনার সিএসভি ইনপুট ফাইলটিতে 10 টি কলাম রয়েছে এবং আপনি বিভাজক হিসাবে কমা ব্যবহার করে 2 থেকে 5 এবং 8 টি কলামগুলি করতে চান।
পৃথককারী নির্দিষ্ট করতে কলামগুলি এবং -d (যার অর্থ "ডিলিমিটার") নির্দিষ্ট করতে ব্যবহার করুন -f (অর্থ "ক্ষেত্রগুলি") ব্যবহার করুন। আপনাকে পরবর্তীটি উল্লেখ করতে হবে কারণ কিছু ফাইল কলাম পৃথক করতে স্পেস, ট্যাব বা কলোন ব্যবহার করতে পারে।
cut -f 2-5,8 -d , myvalues.csv
কাট একটি কমান্ড ইউটিলিটি এবং এখানে আরও কয়েকটি উদাহরণ রয়েছে:
SYNOPSIS
cut -b list [-n] [file ...]
cut -c list [file ...]
cut -f list [-d delim] [-s] [file ...]
আমার cut
/ / awk
প্রার্থনা নয়, উপযুক্ত সিএসভি পার্সিংয়ের দরকার । আমি এটি ম্যাক ছাড়াই চেষ্টা করছি csvtool
, তবে ম্যাক্স রুবি নিয়ে আসে, তাই আপনি এটি করতে পারেন:
echo "require 'csv'; CSV.read('new.csv').each {|data| puts data[34]}" | ruby
প্রথমে আমরা একটি বেসিক সিএসভি তৈরি করব
[dumb@one pts]$ cat > file
a,b,c,d,e,f,g,h,i,k
1,2,3,4,5,6,7,8,9,10
a,b,c,d,e,f,g,h,i,k
1,2,3,4,5,6,7,8,9,10
তারপরে আমরা 1 ম কলামটি পাই
[dumb@one pts]$ awk -F , '{print $1}' file
a
1
a
1
আমি মনে করি সবচেয়ে সহজ সিএসভিকিট ব্যবহার করা হচ্ছে :
২ য় কলাম পান:
csvcut -c 2 file.csv
তবে, এখানে সিএসভিটিওল রয়েছে এবং সম্ভবত বেশ কয়েকটি অন্যান্য সিএসভি বাশ সরঞ্জাম রয়েছে:
sudo apt-get install csvtool
(ডেবিয়ান-ভিত্তিক সিস্টেমগুলির জন্য)
এটিতে প্রথম সারিতে 'আইডি' থাকা একটি কলাম ফিরে আসবে।
csvtool namedcol ID csv_file.csv
এটি চতুর্থ সারিতে ফিরে আসবে:
csvtool col 4 csv_file.csv
আপনি যদি শিরোনাম সারি বাদ দিতে চান:
csvtool col 4 csv_file.csv | sed '1d'
আমি অবাক হয়েছি কেন এখনও পর্যন্ত উত্তরগুলির মধ্যে কেন সিএসভিকিট উল্লেখ করা হয়নি।
সিএসভিকিট হ'ল সিএসভিতে রূপান্তর ও কাজের জন্য কমান্ড-লাইন সরঞ্জামগুলির একটি স্যুট
আমি এটি সিএসভি ডেটা ম্যানেজমেন্টের জন্য একচেটিয়াভাবে ব্যবহার করি এবং এখনও পর্যন্ত আমি এমন কোনও সমস্যা পাইনি যা সিভিস্কিট ব্যবহার করে সমাধান করতে পারিনি।
একটি সিভিএস ফাইল থেকে এক বা একাধিক কলাম আহরণ করতে আপনি csvcut
ইউটিলিটিটি টুলবক্সের অংশ হিসাবে ব্যবহার করতে পারেন । দ্বিতীয় কলামটি বের করতে এই কমান্ডটি ব্যবহার করুন:
csvcut -c 2 filename_in.csv > filename_out.csv
যদি সিএসভিতে স্ট্রিংগুলি উদ্ধৃত হয় তবে q
বিকল্পটির সাথে উদ্ধৃতি অক্ষর যুক্ত করুন :
csvcut -q '"' -c 2 filename_in.csv > filename_out.csv
সাথে ইনস্টল করুন pip install csvkit
বা sudo apt install csvkit
।
আপনি সম্পূর্ণ সিএসভি পার্সার ছাড়াই এটি করতে পারবেন না।
cut
গণনা?
এই কোডটি কিছু সময়ের জন্য ব্যবহার করা হয়েছে, আপনি "স্ট্যাকওভারফ্লো থেকে কাটা এবং আটকানো" গণনা না করা "দ্রুত" নয়।
এটি আইএফএসের পরিবর্তে একটি লুপে $ {##} এবং $ {%%} অপারেটর ব্যবহার করে। এটি 'এরর' এবং 'ডাই' বলে ডাকে এবং এসইপি চর হিসাবে কেবল কমা, ড্যাশ এবং পাইপ সমর্থন করে (এটাই আমার দরকার)।
err() { echo "${0##*/}: Error:" "$@" >&2; }
die() { err "$@"; exit 1; }
# Return Nth field in a csv string, fields numbered starting with 1
csv_fldN() { fldN , "$1" "$2"; }
# Return Nth field in string of fields separated
# by SEP, fields numbered starting with 1
fldN() {
local me="fldN: "
local sep="$1"
local fldnum="$2"
local vals="$3"
case "$sep" in
-|,|\|) ;;
*) die "$me: arg1 sep: unsupported separator '$sep'" ;;
esac
case "$fldnum" in
[0-9]*) [ "$fldnum" -gt 0 ] || { err "$me: arg2 fldnum=$fldnum must be number greater or equal to 0."; return 1; } ;;
*) { err "$me: arg2 fldnum=$fldnum must be number"; return 1;} ;;
esac
[ -z "$vals" ] && err "$me: missing arg2 vals: list of '$sep' separated values" && return 1
fldnum=$(($fldnum - 1))
while [ $fldnum -gt 0 ] ; do
vals="${vals#*$sep}"
fldnum=$(($fldnum - 1))
done
echo ${vals%%$sep*}
}
উদাহরণ:
$ CSVLINE="example,fields with whitespace,field3"
$ $ for fno in $(seq 3); do echo field$fno: $(csv_fldN $fno "$CSVLINE"); done
field1: example
field2: fields with whitespace
field3: field3
আপনি লুপ করার সময়ও ব্যবহার করতে পারেন
IFS=,
while read name val; do
echo "............................"
echo Name: "$name"
done<itemlst.csv
echo '1,"2,3,4,5",6' | awk -F "\"*,\"*" '{print $2}'
2
পরিবর্তে মুদ্রণ করবে2,3,4,5
।