Unix الأمر إلى إيجاد سلسلة من التقاطعات أو القيم المتطرفة?

StackOverflow https://stackoverflow.com/questions/1016244

  •  06-07-2019
  •  | 
  •  

سؤال

هل هناك 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

تنتج ثلاثة أعمدة من الناتج

  1. خطوط فقط في file1
  2. خطوط فقط في file2
  3. خطوط في كلا التنسيق 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)

إذا الملفات الخاصة بك لا يتم فرز و/أو إذا قد يكون هناك خطوط التي تتكرر داخل أحد الملفات ولكن لا تظهر في الآخر - هذا واحد سطر الأوامر سيتم فرز الملفات الخاصة بك, إزالة تكرار الخطوط و سوف تحصل مباشرة على النتائج المرجوة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top