Утилита join
объединяет строки двух файлов на основе общего столбца. Это требует, чтобы файлы были отсортированы по этому столбцу.
join -t $'\t' -1 10 -2 1 -o 2.1,2.2,1.7 <(sort -t $'\t' -k10 file1) <(sort -t $'\t' file2)
$ '\ t'
- это символ табуляции, -t $ '\ t'
говорит использовать его в качестве разделителя полей. join -1 10 -2 1
означает объединение строк, когда поле 10 первого файла совпадает с полем 1 второго файла. -o…
перечисляет поля для вывода. использует вывод команды sort
как один из входов join
.
$ '…'
и требуют ksh или bash, они не работают в обычном sh.
Если file2
уже отсортирован, вы можете использовать это, которое работает в обычном sh:
sort -t $'\t' -k10 file1 |
join -t "$(printf \\t)" -1 10 -2 1 -o 2.1,2.2,1.7 - file2
Если вы хотите сохранить порядок одного из файлов, вы все равно можете использовать join
, но сначала добавьте номера строк, а в конце отсортируйте по исходным номерам строк. Например, чтобы сохранить порядок файл2
:
join -t $'\t' -1 10 -2 1 -o 2.1,2.2,2.3,1.7 \
<(sort -t $'\t' -k10 file1) \
<(
Возможно, что-то вроде этого решит проблему:
#!/bin/bash
function printThing(){
local timeVar=$(date +"%T")
local lines="\
XX----------------------------------------------------------XX
|XXX |XXX
| XX | XXX
| XX------------------------------------------------------+-----XXX
| | +
| | +----------------------------------------------------+ |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | $timeVar | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
+XX--+ | | |
XX | +----------------------------------------------------+ |
XXX |
+--------------------------------------------------------------+"
for i in "${lines[@]}"
do
echo "$i"
done
}
printf "\033c"
while :
do
timeVar=$(date +"%T")
printThing
sleep 1
printf "\033c"
done
Если у вас установлен ncurses
, вы можете использовать команду tput
, чтобы переместить курсор в какое-либо место на терминал, где вы можете использовать любую команду печати.
Пример:
clear
for i in $(seq 1 40)
do
echo '## ##'
done
for i in $(seq 1 100)
do
tput cup 20 5
date
sleep 1
done
Однако перед выходом из функции вы можете переместить курсор в безопасное место. Например, используя
tput cup $(tput lines) 0
, который переместит его в последнюю строку терминала.
Для терминалов, которые его поддерживают, можно использовать escape-последовательности курсора сохранения и курсора восстановления :
#! /bin/sh -
save_cursor=$(tput sc) restore_cursor=$(tput rc)
text="\
XX----------------------------------------------------------XX
|XXX |XXX
| XX | XXX
| XX------------------------------------------------------+-----XXX
| | +
| | +----------------------------------------------------+ |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | $save_cursor$(date +%T) <------+ Characters to replace! |
| | | | |
| | | <--------------------------+ | |
| | | | |
| | | | |
| | | | |
+XX--+ | | |
XX | +----------------------------------------------------+ |
XXX |
+--------------------------------------------------------------+"
printf '%s\n' "$text"
while sleep 1; do
printf %s "$restore_cursor$(date +%T)"
done