[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

[文本处理] 怎样用批处理写出类似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
复制代码
請教各位大俠,如用批次檔怎樣寫出來?是否可以達成?謝謝

你这是最前一行變成最後一行吧,不是列。
记得namejm写过一个反序列出文本的每行内容的批处理

TOP

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

{ot}:lz是香港同胞还是台湾同胞?说话很文绉绉,很有条理.
for /f "delims=" %%a in ('%0') do (echo %%a)

TOP

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

我不會批次檔,看大大們寫的批只會會看得懂一些簡單腳本

TOP

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
复制代码
楼主是否要这样的效果?
(*^_^*)

TOP

批处理倒序显示文本内容
http://bbs.bathome.net/thread-4127-1-1.html
我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

纯bat解决这个问题好像是没有理想的代码,需设置大量的变量,若遇大文件时不但效率低还要考虑变量溢出的问题,最好使用命令行第三方工具如gawk 或 sed 等。
技术问题请到论坛发帖求助!

TOP

這不通用的, 如果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 ~
复制代码
只要有一些標點符號就不能正確工作

TOP

回复 8楼 的帖子

6、7楼,已经说过,批处理不能达到完美的通用,可以考虑6、7楼的建议!
(*^_^*)

TOP

回复 8楼 的帖子

请仔细看看6楼提供的链接吧
我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

@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

TOP

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

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

TOP

返回列表