标题: [文本处理] 怎样用批处理写出类似Linux 的tac命令实现文本倒序/反转输出? [打印本页]
作者: twfcc 时间: 2009-6-14 10:02 标题: 怎样用批处理写出类似Linux 的tac命令实现文本倒序/反转输出?
本帖最后由 pcl_test 于 2016-7-15 12:46 编辑
在Linux下有一個命令名 `tac' , 它把文件反過來打印,即把文件由最後一列先打印,最前一列變成最後一列, 如- nc10@your-5554c55be4 ~
- $ for i in {1..5};do echo $i ;done > mytest.txt
-
- nc10@your-5554c55be4 ~
- $ cat mytest.txt
- 1
- 2
- 3
- 4
- 5
-
- nc10@your-5554c55be4 ~
- $ tac mytest.txt
- 5
- 4
- 3
- 2
- 1
复制代码
如果是其它Unix, 沒有這命令,也可用其它方法達成,如- nc10@your-5554c55be4 ~
- $ nl mytest.txt | sort -nr | cut -f2-
- 5
- 4
- 3
- 2
- 1
复制代码
或者用上 gawk, perl- nc10@your-5554c55be4 ~
- $ gawk '{s[NR]=$0;next}END{for(t=NR;t>=0;t--)print s[t]}' mytest.txt
- 5
- 4
- 3
- 2
- 1
-
- nc10@your-5554c55be4 ~
- $ perl -e 'print reverse<>' mytest.txt
- 5
- 4
- 3
- 2
- 1
复制代码
甚至用bash 寫一個- nc10@your-5554c55be4 ~
- $ cat tac.bsh
- #! /bin/bash
- IFS='
- '
- mytac(){
- local file rev element
- file=$1
- rev=($(<$file))
- element=${#rev[@]}
-
- for ((i=$((element - 1)); i>=0; i--))
- do
- echo ${rev[$i]}
- done
- }
-
- mytac "$1"
-
- nc10@your-5554c55be4 ~
- $ ./tac.bsh mytest.txt
- 5
- 4
- 3
- 2
- 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复制代码
实现代码:- @echo off&setlocal enabledelayedexpansion
- for /f "delims=" %%i in (a.txt) do set "str=%%i !str!"
- for %%a in (%str%) do echo %%a
- 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 如是- a man and a pen
- who are you
- fooo
- 1
- 3455555 ;
- are you happy!
复制代码
上面 的 Linux, Unix 命令是通用的- User@User-PC ~
- $ cat a.txt
- a man and a pen
- who are you
- fooo
- 1
- 3455555 ;
- are you happy!
-
- User@User-PC ~
- $ cat tac.bsh
- #! /bin/bash
- IFS='
- '
- mytac(){
- local file rev element
- file=$1
- rev=($(<$file))
- element=${#rev[@]}
-
- for ((i=$((element - 1)); i>=0; i--))
- do
- echo ${rev[$i]}
- done
- }
-
- mytac "$1"
-
- User@User-PC ~
- $ ./tac.bsh a.txt
- are you happy!
- 3455555 ;
- 1
- fooo
- who are you
- a man and a pen
- User@User-PC ~
- $ gawk '{s[NR]=$0;next}END{for(t=NR;t>=0;t--)print s[t]}' a.txt
- are you happy!
- 3455555 ;
- 1
- fooo
- who are you
- a man and a pen
-
-
- User@User-PC ~
- $ perl -e 'print reverse<>' a.txt
- are you happy!
- 3455555 ;
- 1
- fooo
- who are you
- a man and a pen
-
- User@User-PC ~
- $ nl a.txt | sort -rn | cut -f2-
- are you happy!
- 3455555 ;
- 1
- fooo
- who are you
- a man and a pen
- User@User-PC ~
- $ sed '1!G;h;$!d' a.txt
- are you happy!
- 3455555 ;
- 1
- fooo
- who are you
- a man and a pen
-
- 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 |