Windows批处理 - 打印最后一列

时间:2015-07-29 01:38:48

标签: windows batch-file delimited-text

在Unix中,我使用它来打印分隔字符串的最后一列:

echo "a,b,c,d" | awk -F, '{print $NF}'

我有一个命令,它将输出逗号分隔的字符串但不会总是具有相同的列数。该命令在循环内执行,每次迭代可以给出不同数量的列。我可以用什么来打印这个变量列输出的最后一列?

2 个答案:

答案 0 :(得分:0)

  • 任意列数,不输出Data Source=(localdb)\v11.0;.... 个字符

    !
  • 任意列数,输出@echo off setlocal enableDelayedExpansion for /f "delims=" %%L in ('csv command') do ( set "line=%%L" & set line="!line:,=" "!" for %%C in (!line!) do set last_col=%%C echo !last_col:~1,-1! ) pause 个字符,但不会集成在依赖!的较大循环中。

    setlocal

答案 1 :(得分:0)

如果逗号分隔值(CSV)字符串的输出存储在EnableDelayedExpansion中且没有任何输入值为空,则此变量不依赖于%CSVSTRING%

@echo off 

echo.%CSVSTRING%

rem initialise variables
set LASTCOLUMN=
set /A COUNTER=0

:LOOPBEGIN
rem there is a simple `goto` loop to prevent delayed expansion
set /A COUNTER+=1

for /F "tokens=%COUNTER% delims=," %%A in ("%CSVSTRING%") do (
if "%%A"=="" goto :LOOPEND
set LASTCOLUMN=%%A
goto :LOOPBEGIN)

:LOOPEND
echo.%LASTCOLUMN%

由于for命令,CSV令牌的数量限制为31(每行)!

要获取存储在变量%CSVSTRING%中的CSV字符串,可以使用以下方法(此处使用示例命令echo a,b,c,d):

  1. 将CSV输出重定向到临时文件:

    rem store CSV string to temporary file
    (echo a,b,c,d) > list.tmp
    rem load temporary file into variable
    set /P CSVSTRING= < list.tmp
    rem delete temporary file (remove `/P` to avoid prompt)
    del /P list.tmp
    
    rem notice that `(echo a,b,c,d) | set /P CSVSTRING=` will not work!
    
  2. 将返回CSV输出的命令嵌入到for命令中:

    rem command returning the CSV string is embedded in `for` command
    for /F "delims=" %%A in ('echo a^,b^,c^,d') do set CSVSTRING=%%A
    rem all the `,` must be escaped with `^` here in this sample,
    rem otherwise they will be repaced by spaces
    
  3. 从这个答案的顶部将CSV输出汇总到批处理脚本(让我们称之为seeklast.bat):

    • 必须这样命令:

      (echo a,b,c,d) | seeklast.bat
      
    • 搜索最后一个CSV令牌(seeklast.bat)的批处理脚本必须以此开头:

      rem pipe output of command returning CSV string into the batch
      set /P CSVSTRING=
      
  4. 如果要将CSV字符串作为命令行参数提供给上述批处理脚本(seeklast.bat),则必须以此开头:

        set CSVSTRING=%*