2015-07-29 2 views
0

В Unix Я использую это напечатать последнюю колонку строку с разделителями:Windows, партия - Печать последний столбец

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

У меня есть команда, которая будет выводить через запятую строку, но не всегда будет иметь тот же Число столбцов. Команда выполняется в цикле, и каждая итерация может давать другое количество столбцов. Что я могу использовать для печати последнего столбца вывода этой переменной-столбца?

+0

Является ли число столбцов ограниченное каким-то образом (мин./макс.)? – aschipfl

ответ

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.

    @echo off 
    for /f "delims=" %%L in ('csv command') do (
        set "line=%%L" 
        setlocal enableDelayedExpansion & set line="!line:,=" "!" 
        for %%C in (!line!) do endlocal & set "last_col=%%C" 
        setlocal enableDelayedExpansion & echo !last_col:~1,-1! 
        endlocal 
    ) 
    pause 
    
+0

Спасибо! Оба эти параметра работали для моего теста.Я разорван, хотя между использованием отложенного расширения или нет. Атрибут о том, что я не знаю о DE, но, похоже, это так! и я не уверен в каких-либо других побочных эффектах. Кажется «безопаснее» вообще не использовать его? Или я просто параноик? – Tim

+0

Отложенный режим расширения не является чем-то странным (не более, чем сам пакетный синтаксис), он фактически обеспечивает нормальное поведение переменных, подобных другим языкам. – wOxxOm

+0

Спасибо. Я закончил использовать ваш второй вариант, так как он использует меньше переменных %% и не сбивает другие переменные %%, используемые в моем другом для циклов. – Tim

0

Вот вариант, не полагаясь на EnableDelayedExpansion, при условии, что выход из разделенных запятыми значений (CSV), строка хранится в %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% 

Относительно того, что количество токен CSV ограничено 31 (в строке) из-за команды for!


Чтобы получить строку CSV, хранящуюся в переменной %CSVSTRING%, существуют следующие способы (например, команда 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= 
      

Если вы хотите, чтобы предоставить строку CSV в качестве аргумента командной строки к выше пакетному сценарию (seeklast.bat), он должен начать с этого:

set CSVSTRING=%* 
+0

Это сработало! Очень приятно, и хорошо иметь опцию, которая не использует отложенное расширение. Хотел бы я принять два ответа !! – Tim

+0

Отлично! ... но вы могли бы поддержать каждый полезный ответ и принять тот, который вам больше всего помог ... ;-) – aschipfl

Смежные вопросы