سؤال

لدي بفواصل الملف "myfile.csv" حيث 5 عمود التاريخ/الوقت الطوابع.(mm/dd/yyyy hh:mm). أحتاج إلى سرد كافة الصفوف التي تحتوي على تكرار التواريخ (وهناك الكثير)

أنا باستخدام باش قذيفة عبر cygwin لويندوز إكس بي

$ cut -d, -f 5 myfile.csv | sort | uniq -d 

صحيح بإرجاع قائمة مكررة التواريخ

01/01/2005 00:22
01/01/2005 00:37
[snip]    
02/29/2009 23:54

ولكن أنا لا يمكن معرفة كيفية تغذية هذا البقرى أن تعطيني جميع الصفوف.من الواضح أنني لا يمكن استخدام xargs على التوالي منذ الناتج يحتوي على مسافات.اعتقدت أنني يمكن أن تفعل uniq -z -d لكن لسبب ما الجمع بين هذه الأعلام أسباب uniq (على ما يبدو) لا عودة.

وذلك بالنظر إلى أن

 $ cut -d, -f 5 myfile.csv | sort | uniq -d -z | xargs -0 -I {} grep '{}' myfile.csv

لا يعمل...ماذا يمكنني أن أفعل ؟

وأنا أعلم أنني يمكن أن تفعل هذا في perl أو آخر لغة البرمجة...لكن طبيعة عنيدة تصر على أنه يجب أن تكون قادرة على القيام بذلك في bash باستخدام معيار فلكس أدوات مثل sort, uniq, find, grep, cut, ، وما إلى ذلك.

علمني يا باش معلمو.كيف يمكنني الحصول على قائمة الصفوف أريد باستخدام نموذجي cli الأدوات ؟

هل كانت مفيدة؟

المحلول

  1. نوع -k5,5 سوف تفعل الفرز على حقول وتجنب قطع ؛
  2. uniq -f 4 سيتم تجاهل أول 4 حقول uniq;
  3. بالإضافة إلى a-D على uniq سوف تحصل على كل المتكررة على خطوط (vs-د التي يحصل لك مجرد واحدة) ؛
  4. ولكن uniq تتوقع المفصول بدلا من csv ، لذلك tr '\' ر ',' لإصلاح ذلك.

المشكلة إذا كان لديك الحقول بعد #5 مختلفة.هي تواريخ كل نفس الطول ؟ كنت قد تكون قادرة على إضافة -w 16 (أن تشمل الوقت) ، أو -ث 10 (فقط التواريخ) ، uniq.

لذلك:

tr '\t' ',' < myfile.csv | sort -k5,5 | uniq -f 4 -D -w 16

نصائح أخرى

على -z خيار uniq يحتاج الإدخال إلى NUL فصل.يمكنك تصفية الإخراج من cut من خلال:

tr '\n' '\000'

للحصول على الصفر فصل الصفوف.ثم sort, uniq و xargs لديك خيارات للتعامل مع هذا.محاولة شيء من هذا القبيل:

cut -d, -f 5 myfile.csv | tr '\n' '\000' | sort -z | uniq -d -z | xargs -0 -I {} grep '{}' myfile.csv

تحرير:موقف tr في الأنابيب كان خطأ.

يمكنك أن تقول xargs إلى استخدام كل سطر كحجة في مجملها باستخدام الخيار-d.محاولة:

cut -d, -f 5 myfile.csv | sort | uniq -d | xargs -d '\n' -I '{}' grep '{}' myfile.csv

محاولة الهروب من المساحات مع sed:

echo 01/01/2005 00:37 | sed 's/ /\\ /g'
cut -d, -f 5 myfile.csv | sort | uniq -d | sed 's/ /\\ /g' | xargs -I '{}' grep '{}' myfile.csv

(طريقة أخرى سيكون من قراءة مكررة تاريخ الخطوط في IFS=$' ' مجموعة تكرار ذلك في حلقة for.)

هذا هو مرشح جيد awk:

BEGIN { FS="," }
{ split($5,A," "); date[A[0]] = date[A[0]] " " NR }
END { for (i in date) print i ":" date[i] }
  1. تعيين الحقل المفرق إلى ',' (CSV).
  2. تقسيم الميداني الخامس على مساحة عصا النتيجة في A.
  3. سلسلة رقم السطر إلى قائمة ما سبق تخزينها على ذلك التاريخ.
  4. طباعة أرقام الأسطر لكل تاريخ.
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top