كيف تحافظ على تنسيق الملف إذا كنت تستخدم الأمر uniq (في Shell)؟

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

سؤال

من أجل استخدام الأمر UNIQ، عليك فرز الملف الخاص بك أولاً.

لكن في الملف الذي أمتلكه، يعد ترتيب المعلومات أمرًا مهمًا، فكيف يمكنني الاحتفاظ بالتنسيق الأصلي للملف مع التخلص من المحتوى المكرر؟

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

المحلول

ونسخة AWK أخرى:

awk '!_[$0]++' infile

نصائح أخرى

وهذا awk تحافظ على التواجد الأول. نفس الخوارزمية كما إجابات أخرى تستخدم:

awk '!($0 in lines) { print $0; lines[$0]; }'

وهنا واحد التي تحتاج فقط لتخزين خطوط المكررة (على العكس من كل خطوط) باستخدام awk:

sort file | uniq -d | awk '
   FNR == NR { dups[$0] }
   FNR != NR && (!($0 in dups) || !lines[$0]++)
' - file

وهناك أيضا "خط رقم، انقر نقرا مزدوجا نوع" الأسلوب.

 nl -n ln | sort -u -k 2| sort -k 1n | cut -f 2-

ويمكنك تشغيل UNIQ -d على نسخة فرزها من ملف للعثور على خطوط مكررة، ثم تشغيل بعض البرامج النصية التي تقول:

if this_line is in duplicate_lines {
    if not i_have_seen[this_line] {
        output this_line
        i_have_seen[this_line] = true
    }
} else {
    output this_line
}

باستخدام uniq و grep فقط:

إنشاء د.ش:

#!/bin/sh
sort $1 | uniq > $1_uniq
for line in $(cat $1); do
cat $1_uniq | grep -m1 $line >> $1_out
cat $1_uniq | grep -v $line > $1_uniq2
mv $1_uniq2 $1_uniq
done;
rm $1_uniq

مثال:

./d.sh infile

هل يمكن استخدام بعض O الرهيبة (ن ^ 2) شيء، مثل هذا (الزائفة رمز):

file2 = EMPTY_FILE
for each line in file1:
  if not line in file2:
    file2.append(line)

وهذا يحتمل أن تكون بطيئة نوعا ما، خاصة إذا ما نفذت على مستوى باش. ولكن إذا ملفاتك هي قصيرة معقولة، فإنه من المحتمل أن تعمل على ما يرام، وسوف تكون سريعة لتنفيذ (not line in file2 هو بعد ذلك فقط grep -v، وهلم جرا).

وإلا هل يمكن بالطبع كود برنامجا مخصصة، وذلك باستخدام بعض هياكل البيانات أكثر تقدما في الذاكرة لتسريع العملية.

for line in $(sort file1 | uniq ); do
    grep -n -m1 line file >>out
done;

sort -n out

وبه أولا هذا النوع،

ولكل البقرى قيمة متالقه للمباراة الأولى (-m1)

ووالحفاظ على أرقام الأسطر

وفرز الناتج عدديا (-n) من خلال رقم السطر.

هل يمكن بعد ذلك إزالة السطر # الصورة مع الحزب الاشتراكي الموحد أو AWK

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