Ваш первый подход работает, вам просто нужно дать командуifne
(см.man ifne
):
NAME
ifne - Run command if the standard input is not empty
SYNOPSIS
ifne [-n] command
DESCRIPTION
ifne runs the following command if and only if the standard input is
not empty.
Значит, нужно дать ему команду запуститься. Ты почти у цели, tee
сработает:
command | ifne tee myfile > /dev/null
Если ваша команда не производит огромное количество данных, если они достаточно малы, чтобы поместиться в переменную,вы также можете сделать:
var=$(mycommand)
[[ -n $var ]] && printf '%s\n' "$var" > myfile
Это awk
вам подходит?
awk 'FNR==NR {array[$2]=$0; next} {$0=array[$1]}/./{print}' file2 file1
Выход
$ awk 'FNR==NR {array[$2]=$0; next} {$0=array[$1]}/./{print}' file2 file1
333 ttt
444 kkk
Ваш awk
терпит неудачу, потому что вы используете оба поля в качестве ключа, но ваш file1
имеет только одно поле, поэтому оба никогда не будут присутствовать в массиве c
. Кроме того, вы используете параметр -F
для указания разделителя полей, но на самом деле его не задаете. Это означает, что разделителем полей будет сам awk-скрипт :
awk -F 'script' file
Вот рабочая версия вашей awk
попытки:
$ awk 'NR==FNR{c[$1]++;next};c[$2] ' file1 file2
333 ttt
444 kkk
А вот более эффективная версия, которая не использует больше памяти, чем необходимо:
$ awk 'NR==FNR{c[$1]}; $2 in c' file1 file2
333 ttt
444 kkk
Ваш join
также неправильно использует опцию -t
. Как и в случае с -F
из awk
, -t
также принимает аргумент, а вы ему его не даете. Затем join
требует сортировки ввода. Вот рабочая версия вашего join
подхода:
$ join -1 1 -2 2 -o 2.1,2.2 <(sort file1) <(sort -k2 file2)
444 kkk
333 ttt
#!/usr/bin/python
k1=open('file1','r')
for f1 in k1:
k2=open('file2','r')
for f2 in k2:
if f1.strip() in f2.strip():
print f2.strip()
~
выход
333 ttt
444 kkk