Сравнивать два файла и выводить пустую строку для несоответствия?

Я также сталкивался с этим нежелательным пробелом при работе с другой базой данных. Ясно, что сценарии оболочки и инструменты, такие как 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
0
13.06.2018, 22:52
4 ответа
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
$
1
28.01.2020, 02:14

Вместо $3 in a{print $1,$2,$3}попробуйте !($3 in a){$0 = ""} 1.

3
28.01.2020, 02:14

Предположим, что оба файла отсортированы по полю соединения:

$ 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 )
2
28.01.2020, 02:14
  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'
1
28.01.2020, 02:14

Теги

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