Board logo

标题: [文本处理] 怎样用批处理写出类似Linux 的tac命令实现文本倒序/反转输出? [打印本页]

作者: twfcc    时间: 2009-6-14 10:02     标题: 怎样用批处理写出类似Linux 的tac命令实现文本倒序/反转输出?

本帖最后由 pcl_test 于 2016-7-15 12:46 编辑

在Linux下有一個命令名 `tac' , 它把文件反過來打印,即把文件由最後一列先打印,最前一列變成最後一列, 如
  1. nc10@your-5554c55be4 ~
  2. $ for i in {1..5};do echo $i ;done > mytest.txt
  3. nc10@your-5554c55be4 ~
  4. $ cat mytest.txt
  5. 1
  6. 2
  7. 3
  8. 4
  9. 5
  10. nc10@your-5554c55be4 ~
  11. $ tac mytest.txt
  12. 5
  13. 4
  14. 3
  15. 2
  16. 1
复制代码
如果是其它Unix, 沒有這命令,也可用其它方法達成,如
  1. nc10@your-5554c55be4 ~
  2. $ nl mytest.txt | sort -nr | cut -f2-
  3. 5
  4. 4
  5. 3
  6. 2
  7. 1
复制代码
或者用上 gawk, perl
  1. nc10@your-5554c55be4 ~
  2. $ gawk '{s[NR]=$0;next}END{for(t=NR;t>=0;t--)print s[t]}' mytest.txt
  3. 5
  4. 4
  5. 3
  6. 2
  7. 1
  8. nc10@your-5554c55be4 ~
  9. $ perl -e 'print reverse<>' mytest.txt
  10. 5
  11. 4
  12. 3
  13. 2
  14. 1
复制代码
甚至用bash 寫一個
  1. nc10@your-5554c55be4 ~
  2. $ cat tac.bsh
  3. #! /bin/bash
  4. IFS='
  5. '
  6. mytac(){
  7.         local file rev element
  8.         file=$1
  9.         rev=($(<$file))
  10.         element=${#rev[@]}
  11.            for ((i=$((element - 1)); i>=0; i--))
  12.                do
  13.                   echo ${rev[$i]}
  14.                done
  15.            }
  16. mytac "$1"
  17. nc10@your-5554c55be4 ~
  18. $ ./tac.bsh mytest.txt
  19. 5
  20. 4
  21. 3
  22. 2
  23. 1
复制代码
請教各位大俠,如用批次檔怎樣寫出來?是否可以達成?謝謝
作者: tab    时间: 2009-6-14 10:22

你这是最前一行變成最後一行吧,不是列。
记得namejm写过一个反序列出文本的每行内容的批处理
作者: BBCC    时间: 2009-6-14 12:05

觉得用批写效率颇低(用awk之类文本流工具应该更好),说错别pia我,希望各位大大能否定我的观点!

{ot}:lz是香港同胞还是台湾同胞?说话很文绉绉,很有条理.
作者: twfcc    时间: 2009-6-14 13:45

是行,不是列,寫錯了...
to BBCC 兄:
我來自香港,常來這裡是找些題目練習 shell , Perl 或其它腳本語言,
這裡有很多文本編輯批,但很少有通用的函數或腳本,也
想了解對於不支援數組的cmd.exe 能否作比較複雜的編輯?

我不會批次檔,看大大們寫的批只會會看得懂一些簡單腳本
作者: keen    时间: 2009-6-14 13:47

a.txt
  1. 1
  2. 2
  3. 3
  4. 4
  5. 5
复制代码
实现代码:
  1. @echo off&setlocal enabledelayedexpansion
  2. for /f "delims=" %%i in (a.txt) do set "str=%%i !str!"
  3. for %%a in (%str%) do echo %%a
  4. pause
复制代码
楼主是否要这样的效果?
作者: Batcher    时间: 2009-6-14 13:57

批处理倒序显示文本内容
http://bbs.bathome.net/thread-4127-1-1.html
作者: 随风    时间: 2009-6-14 13:58

纯bat解决这个问题好像是没有理想的代码,需设置大量的变量,若遇大文件时不但效率低还要考虑变量溢出的问题,最好使用命令行第三方工具如gawk 或 sed 等。
作者: twfcc    时间: 2009-6-14 14:04

這不通用的, 如果a.txt 如是
  1. a man and a pen
  2.   who are you
  3.    fooo
  4.   1
  5.   3455555 ;
  6.   are you happy!
复制代码
上面 的 Linux, Unix 命令是通用的
  1. User@User-PC ~
  2. $ cat a.txt
  3. a man and a pen
  4.   who are you
  5.      fooo
  6.        1
  7.          3455555 ;
  8.            are you happy!
  9. User@User-PC ~
  10. $ cat tac.bsh
  11. #! /bin/bash
  12. IFS='
  13. '
  14. mytac(){
  15.         local file rev element
  16.         file=$1
  17.         rev=($(<$file))
  18.         element=${#rev[@]}
  19.            for ((i=$((element - 1)); i>=0; i--))
  20.                do
  21.                   echo ${rev[$i]}
  22.                done
  23.            }
  24. mytac "$1"
  25. User@User-PC ~
  26. $ ./tac.bsh a.txt
  27.            are you happy!
  28.          3455555 ;
  29.        1
  30.      fooo
  31.   who are you
  32. a man and a pen
  33. User@User-PC ~
  34. $ gawk '{s[NR]=$0;next}END{for(t=NR;t>=0;t--)print s[t]}' a.txt
  35.            are you happy!
  36.          3455555 ;
  37.        1
  38.      fooo
  39.   who are you
  40. a man and a pen
  41. User@User-PC ~
  42. $ perl -e 'print reverse<>' a.txt
  43.            are you happy!
  44.          3455555 ;
  45.        1
  46.      fooo
  47.   who are you
  48. a man and a pen
  49. User@User-PC ~
  50. $ nl a.txt | sort -rn | cut -f2-
  51.            are you happy!
  52.          3455555 ;
  53.        1
  54.      fooo
  55.   who are you
  56. a man and a pen
  57. User@User-PC ~
  58. $ sed '1!G;h;$!d' a.txt
  59.            are you happy!
  60.          3455555 ;
  61.        1
  62.      fooo
  63.   who are you
  64. a man and a pen
  65. User@User-PC ~
复制代码
只要有一些標點符號就不能正確工作
作者: keen    时间: 2009-6-14 14:26     标题: 回复 8楼 的帖子

6、7楼,已经说过,批处理不能达到完美的通用,可以考虑6、7楼的建议!
作者: Batcher    时间: 2009-6-14 14:32     标题: 回复 8楼 的帖子

请仔细看看6楼提供的链接吧
作者: yuz555    时间: 2009-6-17 22:01

@echo off
:star
set Output=
set /p Enter=请输入:
:Start
if not "%Enter%"=="" (
set Output=%Output%%Enter:~-1%
set Enter=%Enter:~0,-1%
goto :Start)
echo.
echo        %Output%
pause >nul&goto :Star
作者: inittab    时间: 2009-6-18 20:29

批处理处理这类问题,觉得效率会比较低。

可以用tac 的win 版本。功能是一样的。




欢迎光临 批处理之家 (http://bbs.bathome.net/) Powered by Discuz! 7.2