Я также сталкивался с этим нежелательным пробелом при работе с другой базой данных. Ясно, что сценарии оболочки и инструменты, такие как SQLPlus, не подходят для извлечения данных из баз данных, но бывают случаи, когда это удобно.
Мое решение - убрать начальные и конечные пробелы из результата:
psnr() {
sqlplus -s USR/PASS@PROD << 'EOS' | sed -e $'s/^[ \t]*//' -e $'s/[ \t]*$//'
SET PAGESIZE 0
SET COLSEP ";"
SET FEEDBACK OFF
SET TRIMOUT ON
SET TRIMSPOOL ON
select max_number-last_number from postalslip
where state = 'OPEN'
/
exit
/
EOS
}
Если ksh
не поддерживает строковый синтаксис $ '...'
, достаточно просто replace:
# Original style
sed $'s/^[ \t]*//'
# Alternative style
T=$(printf "\t")
...
sed "s/^[ $T]*//"
Альтернативным быстрым и грязным решением является использование оболочки для удаления нежелательных пробелов. Не изменяя функцию psnr ()
, вместо этого:
echo "Today's result is: $PSNR" > $MAILTMP
вы должны написать следующее:
echo "Today's result is:" $PSNR > $MAILTMP
for line in $(cat file2);
do
grep $line file1 || echo "";
done
Производит следующий вывод
$ for line in $(cat file2); do grep $line file1 || echo ""; done
BMW 111 N1
TOYOTA 122 N3
$
Предположим, что оба файла отсортированы по полю соединения:
$ join -1 3 -a 2 -o1.1,1.3,1.3 file1 file2
BMW N1 N1
TOYOTA N3 N3
Это выполняет реляционную операцию JOIN для двух файлов, используя третий столбецfile1
(с-1 3
)и первый и единственный столбец file2
. Мы просим, чтобы все строки file2
были включены в вывод (с -a 2
), даже непарные строки. Для вывода просим вывести все три поля первого файла (с флагом -o
). Пустые поля в непарных строках останутся пустыми, но можно добавить -e something
, чтобы заполнить их строкой something
.
Если два файла не отсортированы по полю соединения, вы можете предварительно -отсортировать их, используя
sort -k3 -o file1 file1
sort -o file2 file2
или вы можете выполнить сортировку одновременно с соединением, если ваша оболочка поддерживает подстановку процессов, с помощью
join -1 3 -a 2 -o1.1,1.3,1.3 \
<( sort -k3 file1 ) \
<( sort file2 )
paste file1.txt file2.txt | sed -Ee 's/\s(\S+)\s+\1\s*$/ \1/;t' -e g
Это печатает содержимое файлов рядом друг с другом в каждой строке, а затем мы позволяем Gnu sed работать с этой строкой.
В случае совпадения последних полей файлов, мы стираем это из строки и печатаем. В противном случае мы печатаем пустую строку, извлеченную из пустого пространства хранения.
Другим способом может быть:
paste a.txt b.txt | awk '{NF -= $(NF) == $(NF-1) ? 1 : NF}1'