Unix الأمر إلى إيجاد سلسلة من التقاطعات أو القيم المتطرفة?
سؤال
هل هناك UNIX الأمر على قدم المساواة مع
sort | uniq
العثور على سلسلة مجموعة التقاطعات أو "المتطرفة".
مثال على التطبيق:لدي قائمة من قوالب html, بعض منهم {% تحميل i18n %} سلسلة الداخل والبعض الآخر لا.أريد أن أعرف الملفات التي لا.
تحرير: grep -L يحل هذه المشكلة.
كيف حول هذا:
file1:
mom
dad
bob
file2:
dad
%تتقاطع file1 file2
dad
%اليسار فريدة من نوعها file1 file2
mom
bob
المحلول
يبدو أن grep -L
يحل المشكلة الحقيقية لأصحابها ، لكن السؤال الفعلي طلب إيجاد تقاطع مجموعتين من الخيوط, قد ترغب في النظر في "اتصالات" الأمر.على سبيل المثال ، إذا file1
و file2
تحتوي كل منها على فرز قائمة من الكلمات كلمة واحدة في كل سطر ، ثم
$ comm -12 file1 file2
سوف تنتج كلمات مشتركة في كل الملفات.أكثر عموما ، بالنظر إلى فرز ملفات الإدخال file1
و file2
, الأمر
$ comm file1 file2
تنتج ثلاثة أعمدة من الناتج
- خطوط فقط في file1
- خطوط فقط في file2
- خطوط في كلا التنسيق file1 file2
يمكنك قمع العمود N
في الإخراج مع -N
خيار.لذا الأمر أعلاه ، comm -12 file1 file2
, يمنع الأعمدة 1 و 2 ، ولم يتبق سوى كلمات مشتركة في كل الملفات.
نصائح أخرى
التداخل:
# sort file1 file2 | uniq -d
dad
تبقى فريدة من نوعها:
# sort file1 file2 | uniq -u
bob
mom
ربما أنا سوء الفهم السؤال, ولكن لماذا لا مجرد استخدام البقرى للبحث عن سلسلة (استخدام الخيار-L إلى طباعة أسماء الملفات التي لا تحتوي على السلسلة في نفوسهم).
وبعبارة أخرى
grep -L "{% load i18n %}" file1 file2 file3 ... etc
أو مع أحرف البدل عن أسماء الملفات حسب الاقتضاء.
من http://www.commandlinefu.com/commands/view/5710/intersection-between-two-files:
تقاطع بين اثنين (لم يتم فرزها) الملفات:
grep -Fx -f file1 file2
خطوط في file2 التي ليست في file1:
grep -Fxv -f file1 file2
التفسير:
- على
-f
الخيار يقول البقرى لقراءة أنماط للبحث عن الملف.وهذا يعني أن ينفذ بحث file2 لكل خط في file1. - على
-F
الخيار يقول البقرى لمعرفة مصطلحات البحث ثابتة سلاسل, وليس أنماط ، بحيثa.c
فقط مباراةa.c
و لاabc
, - على
-x
الخيار يقول البقرى للقيام خط كامل البحث ، بحيث "فو" في file1 لن تتطابق مع "س" في file2. - بشكل افتراضي ، البقرى سوف تظهر فقط مطابقة خطوط, مما يتيح لك التقاطع.على
-v
الخيار يقول البقرى لإظهار فقط غير مطابقة خطوط, مما يتيح لك الخطوط التي هي فريدة من نوعها file2.
من الرجل grep
-L, --files-without-match
وقمع العادي الإخراج ؛ بدلا الطباعة اسم كل ملف الإدخال الذي لا الإخراج كان من عادة مطبوعة.المسح الضوئي سوف تتوقف على المباراة الأولى.
حتى إذا القوالب الخاصة بك .html الملفات التي تريد:
grep -L '{% load i18n %}' *.html
تقاطع:
comm -12 <(cat file1 | sort | uniq) <(cat file2 | sort | uniq)
جميع خطوط من 3 أعمدة (file1 | file2 | تقاطع):
comm <(cat file1 | sort | uniq) <(cat file2 | sort | uniq)
إذا الملفات الخاصة بك لا يتم فرز و/أو إذا قد يكون هناك خطوط التي تتكرر داخل أحد الملفات ولكن لا تظهر في الآخر - هذا واحد سطر الأوامر سيتم فرز الملفات الخاصة بك, إزالة تكرار الخطوط و سوف تحصل مباشرة على النتائج المرجوة.