كيفية عكس خطوط ملف نصي؟
-
03-07-2019 - |
سؤال
أنا أكتب برنامج نصي صغير يحتاج إلى عكس أسطر الملف النصي.هل هناك أمر تصفية قياسي للقيام بهذا النوع من الأشياء؟
طلبي المحدد هو أنني أتلقى قائمة بمعرفات التزام Git، وأريد معالجتها بترتيب عكسي:
git log --pretty=oneline work...master | grep -v DEBUG: | cut -d' ' -f1 | reverse
أفضل ما توصلت إليه هو التنفيذ reverse
مثله:
... | cat -b | sort -rn | cut -f2-
يستخدم هذا cat
لترقيم كل سطر، ثم sort
لفرزها بترتيب رقمي تنازلي (مما يؤدي في النهاية إلى عكس الملف بأكمله)، ثم cut
لإزالة رقم السطر غير المرغوب فيه.
ما ورد أعلاه يعمل مع طلبي، ولكنه قد يفشل في الحالة العامة بسبب cat -b
أرقام فقط خطوط غير فارغة.
هل هناك طريقة أفضل وأكثر عمومية للقيام بذلك؟
المحلول
في GNU coreutils ، هناك <لأ href = "HTTP: //www.gnu كافيه / البرمجيات / coreutils / دليل / coreutils.html # تاك الاحتجاج "يختلط =" noreferrer "> تاك (1)
نصائح أخرى
الجواب ليس 42 ولكن tac
.
يحرر: أبطأ ولكن أكثر استهلاكا للذاكرة باستخدام sed
sed 'x;1!H;$!d;x'
وحتى أطول
perl -e'print reverse<>'
هناك معيار أمر لغرضك:
tail -r file.txt
طباعة أسطر file.txt بترتيب عكسي!
و
إذا كان هذا هو القضية الوحيدة التي تريد تجنب، ثم لماذا لا تستخدم "-n القط" إلى رقم كل الخطوط؟
: "@(#)$Id: reverse.sh,v 1.2 1997/06/02 21:45:00 johnl Exp $"
#
# Reverse the order of the lines in each file
awk ' { printf("%d:%s\n", NR, $0);}' $* |
sort -t: +0nr -1 |
sed 's/^[0-9][0-9]*://'
وتعمل مثل السحر بالنسبة لي ...
مشابهه ل سيد المثال أعلاه، باستخدام بيرل - ربما تكون أكثر تذكرًا (اعتمادًا على كيفية توصيل دماغك):
perl -e 'print reverse <>'
في هذه الحالة، ومجرد استخدام --reverse
:
$ git log --reverse --pretty=oneline work...master | grep -v DEBUG: | cut -d' ' -f1
rev <name of your text file.txt>
ويمكنك القيام حتى هذا:
echo <whatever you want to type>|rev
awk '{a[i++]=$0}END{for(;i-->0;)print a[i]}'
المزيد أسرع من sed
ومتوافقة لأجهزة تضمين مثل openwrt.