Использование Bash, прочитать в массив с МФС, установленным на вкладке:
$ cat data
ls ~
cd /home
cp dir1 dir2
al a b c d
$ vis -t -n data
ls^I~^J
cd^I/home^J
cp^Idir1^Idir2^J
al^Ia b^I c d ^J
$ while IFS=$'\t' read -r -a xyz; do al "${xyz[@]}"; done < data
ls
~
cd
/home
cp
dir1
dir2
al
a b
c d
$ while IFS=$'\t' read -r -a xyz; do al "${xyz[@]}"; done < data | vis -t -n
ls^J
~^J
cd^J
/home^J
cp^J
dir1^J
dir2^J
al^J
a b^J
c d ^J
$
vis
программа с опциями -t -n
печатает вкладки как ^I
и новой строки как ^J
(с последующим переводом строки); программа al
печатает свои аргументы по одной в строке - она фактически эквивалентна printf "%s\n" "[email protected]"
(это на самом деле очень простая программа на C, но результат тот же).
С реальными командами в файл, чтобы быть выполнен, вы бы написать:
while IFS=$'\t' read -r -a xyz; do "${xyz[@]}"; done < data
На моей машине, я получил:
$ (while IFS=$'\t' read -r -a xyz; do "${xyz[@]}"; done < data)
ls: ~: No such file or directory
cp: dir1: No such file or directory
a b
c d
$
Я использовал подоболочку, потому что я Жду» t хочу оставить мой текущий каталог в моей основной оболочке, и у меня нет dir1
для копирования в dir2
. Обратите внимание, что оболочка не делала расширения тильды по результатам расширения параметра, поэтому ls
получил, чтобы увидеть фактическую тильду, а не значение моего домашнего каталога. Крепление расширения тильды было бы болезненным - мучительно болезненным (см. Tilde expansion in quotes). Это также означает, что нотация диапазона, такая как {1..10}
, не будет расширяться и что псевдонимы не будут расширены. См. Shell expansions, что бы и не произошло.
'Баш filename' – ShellFish
@ShellFish близко, но если ячейка имеет в нем пробелы, тогда они будут рассматриваться как отдельные аргументы. Я также попробовал '(IFS = $ '\ t'; source load.tsv)' –
Да, это был не ответ, а указатель, поэтому комментарий. Сначала сделайте 'sed -i s// \\/g'. – ShellFish