Передавать несколько аргументов командной строки исполняемому файлу с текстовыми файлами

  1. создайте файл ~/.config/gtk-3.0/gtk.css (добавьте приведенный ниже CSS)
  2. затем вам нужно будет перезагрузить gnome-shell: ALT + F2 и введите r

Я смог уменьшить панель заголовков приложений на Gnome 3.20 с помощью следующего CSS:

headerbar entry,
headerbar spinbutton,
headerbar button,
headerbar separator {
    margin-top: 0px; /* same as headerbar side padding for nicer proportions */
    margin-bottom: 0px;
}

headerbar {
    min-height: 24px;
    padding-left: 2px; /* same as childrens vertical margins for nicer proportions */
    padding-right: 2px;
    margin: 0px; /* same as headerbar side padding for nicer proportions */
    padding: 0px;
  }
3
18.10.2016, 20:45
4 ответа
while 
  IFS= read -r a1 <&3 &&
    IFS= read -r a2 <&4 &&
    IFS= read -r a3 <&5 &&
    IFS= read -r a4 <&6
do
  ./program "$a1" "$a2" "$a3" "$a4" 3<&- 4<&- 5<&- 6<&-
done 3< arg1.txt 4< arg2.txt 5< arg3.txt 6< arg4.txt

Цикл выполняется до тех пор, пока один из файлов не будет исчерпан. Замените && на || , чтобы запустить его до тех пор, пока все файлы не будут исчерпаны (используя пустые аргументы для более коротких файлов).

С GNU xargs вы также можете сделать:

paste -d '\n' arg[1-4].txt | xargs -n 4 -r -d '\n' ./program

(хотя будьте осторожны, ./ program stdin тогда будет / dev / null )

3
27.01.2020, 21:18

В Bash (или какой-либо другой оболочке, поддерживающей $ '' и массивы), это должно работать, если ваши входные файлы не 't contain tabs (*) :

IFS=$'\t'
paste arg1.txt arg2.txt | 
while read -r -a A ; do 
   [ "${#A[@]}" -eq 2 ] && printf "%s - %s\n" ${A[@]}
done 

paste склеивает входные файлы построчно, read -a A считывает столбцы в массив ] A , используя табуляцию (из IFS ) в качестве разделителя. ["$ {# A [@]}" -eq 2] проверяет, что в массиве ровно два члена, а $ {A [@]} удаляет их в командной строке. из printf . При необходимости измените команду.

(* если вам нужна поддержка вкладок, я бы перешел к использованию, например, Perl)

С этими входными файлами:

$ cat arg1.txt 
foo bar
doo
$ cat arg2.txt 
one
two two
three three three

Вывод из приведенного выше фрагмента:

foo bar - one
doo - two two

Последняя строка из arg2.txt игнорируется, поскольку arg1.txt не имеет соответствующей строки. read игнорирует ведущие табуляции, что делает невозможным использование, если мы заботимся о том, в каких столбцах были пропущенные элементы.

0
27.01.2020, 21:18

Проверьте комбинацию команды sed и команды paste. Сначала используйте пасту, чтобы создать новый поток, состоящий из всех четырех файлов. Затем используйте sed, чтобы выбрать нужную строку:

paste arg1.txt arg2.txt arg3.txt arg4.txt | sed -n 10p

напечатает строку 10 вывода из вставки. Это можно передать программе в качестве аргументов с помощью xargs:

paste arg1.txt arg2.txt arg3.txt arg4.txt | sed -n 10p | xargs ./program

Если вы хотите перебрать строки, вы можете использовать команду seq для генерации последовательности, а затем перебирать каждое значение в последовательности:

for i in $(seq 1 100); do 
    paste arg1.txt arg2.txt arg3.txt arg4.txt | sed -n ${i}p | xargs ./program
done

Этот цикл будет медленным, так как он вызывает вставку один раз для каждой итерации. Вероятно, неплохо сначала создать временный файл.

1
27.01.2020, 21:18

Лучший вариант - это предварительное чтение файлов и хранение организованных результатов либо в массивах, либо во временных файлах. В противном случае вам придется вызывать функции чтения четыре раза на каждой итерации и заставлять функцию читать все дальше и дальше в файлах. Это далеко не оптимальный вариант.

Это версия для временных файлов. Осторожно, она не тестировалась.

PROG=./program
TEMPDIR=tmp
mkdir "$TEMPDIR"

# Create the temp files.
for arg in arg*.txt; do
    i=0
    while read a; do
        ((i++))
        printf "%s\n" "$a" >> "$TEMPDIR"/"$i"
    done < "$arg"
done

# Now the temp files are ready.
## Each file contains all arguments for 1 run of ./program,
## each of them on a separate line.

# Start executing the ./program.
for iteration in "$(ls "$TEMPDIR" | sort -n)"; do
    unset args
    while read arg; do
        args=( "$arg" )
    done < "$TEMPDIR"/"$iteration"
    "$PROG" "${args[@]}"
done

# Finally, remove the temp files.
rm -r "$TEMPDIR"
0
27.01.2020, 21:18

Теги

Похожие вопросы