在Unix中,我使用它来打印分隔字符串的最后一列:
echo "a,b,c,d" | awk -F, '{print $NF}'
我有一个命令,它将输出逗号分隔的字符串但不会总是具有相同的列数。该命令在循环内执行,每次迭代可以给出不同数量的列。我可以用什么来打印这个变量列输出的最后一列?
答案 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
):
将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!
将返回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
从这个答案的顶部将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=
如果要将CSV字符串作为命令行参数提供给上述批处理脚本(seeklast.bat
),则必须以此开头:
set CSVSTRING=%*