كيف تحافظ على تنسيق الملف إذا كنت تستخدم الأمر uniq (في Shell)؟
-
22-07-2019 - |
سؤال
من أجل استخدام الأمر 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