سؤال

أنا أكتب برنامج نصي صغير يحتاج إلى عكس أسطر الملف النصي.هل هناك أمر تصفية قياسي للقيام بهذا النوع من الأشياء؟

طلبي المحدد هو أنني أتلقى قائمة بمعرفات التزام 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 بترتيب عكسي!

<اقتباس فقرة> القط -b أرقام فقط خطوط غير الفارغة "

و
إذا كان هذا هو القضية الوحيدة التي تريد تجنب، ثم لماذا لا تستخدم "-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.

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