У меня есть два файла. Допустим, файл1 и файл2
файл1 содержит « разделенный пробелами
file2 имеет " eipasoc-47367a3f eipassoc-10bbfb6 " каждый из них разделен пробелом
Я хотел напечатать " eipassoc -03cd9117d7188d2 eipasoc-bbbddc3 "в файле 3 . поскольку все, что я пытаюсь сделать, это не соответствующие слова из файла1.
Я пытался использовать «awk», «for loop», «while loop», но не смог найти решение. Любая идея о том, как минус и получить только непревзойденные.
Спасибо всем.
Я использовал комбинацию, чтобы заставить это делать то, что Вы хотите:
Генерируйте массивы с:
l1=$(cut -d" " -f 1- src1.txt)
l2=$(cut -d" " -f 1- src2.txt)
Используйте команду как это для сравнения обоих массивов:
l1=$(cut -d" " -f 1- src1.txt) && l2=$(cut -d" " -f 1- src2.txt) && echo "${l1[@]}" "${l2[@]}" | tr ' ' '\n' | sort | uniq -u | xargs -L 2 > result.txt
Результат:
a c
Информация:
echo "${l1[@]}" "${l2[@]}" | tr ' ' '\n'
: переведите вывод команды эха и заменяющий каждое пространство новой строкой
| sort | uniq -u
: отсортируйте вывод и найдите уникальные значения
| xargs -L 2 > result.txt
: передайте результат последней команды в файл результата
l1=$(cut -d" " -f 1- src1.txt)
и l2=$(cut -d" " -f 1- src2.txt)
: Генерируйте массивы
Демонстрационный тест:
george@george-Inspiron-5570:/tmp$ echo "eipassoc-03cd9117d7188d2 eipasoc-47367a3f eipasoc-bbbddc3 eipassoc-10bbfb6" > f1.txt
george@george-Inspiron-5570:/tmp$ echo "eipasoc-47367a3f eipassoc-10bbfb6" > f2.txt
george@george-Inspiron-5570:/tmp$ l1=$(cut -d" " -f 1- f1.txt) && l2=$(cut -d" " -f 1- f2.txt) && echo "${l1[@]}" "${l2[@]}" | tr ' ' '\n' | sort | uniq -u | xargs -L 2 > result.txt
george@george-Inspiron-5570:/tmp$ cat result.txt
eipasoc-bbbddc3 eipassoc-03cd9117d7188d2
george@george-Inspiron-5570:/tmp$
Сначала помните, что, учитывая любые два списка, существует 3 типа различия, которое мы можем вычислить:
Стандартный инструмент Unix для сравнения списков (файлы) линию за линией comm
. Это обычно выводы 3 столбца - от man comm
:
With no options, produce three-column output. Column one contains
lines unique to FILE1, column two contains lines unique to FILE2, and
column three contains lines common to both files.
соответствие первому, второму, и дополнению множества третьего типа различия. Это также требует, чтобы его исходные данные были отсортированы.
$ comm <(tr ' ' '\n' < file1 | sort) <(tr ' ' '\n' < file2 | sort)
a
b
c
d
(существует пустой средний столбец здесь, с тех пор для Ваших исходных данных в качестве примера нет никаких различий второго типа).
При предположении, что то, что Вы хотите, является первым типом различия (элементы, которые находятся в Списке 1, но не находятся в Списке 2) мы можем сказать comm
подавить другие столбцы и затем вставить результат назад в разделенный пробелами список:
$ comm -23 <(tr ' ' '\n' < file1 | sort) <(tr ' ' '\n' < file2 | sort) | paste -sd ' '
a c
Если Вам не нравится этот подход, то жемчуг имеет Список:: Сравните модуль, который Вы могли использовать:
$ cat file1 file2 | perl -MList::Compare -alne '
push @{ $a[$.] }, @F
}{
$lc = List::Compare->new($a[1], $a[2]);
print join " ", $lc->get_Lonly()
'
a c
Другие языки (Python, рубин и т.д.), вероятно, имеют эквивалентную функциональность.
Кажется, что у Вас есть два файла с огромной строкой каждый, который содержит (располагают разделенные маркеры с интервалами). Различный инструмент хорош для соответствия строки. Для объектов в строке необходимо будет быть немного более творческими.
Например,
:~$ cat file1
a b c d
:~$ cat file2
b d
:~$ cat file1 | sed 's/ /\n/g' |grep -vf <(cat file2|sed 's/ /\n/g') | tr '\n' ' '; echo
a c
мы можем использовать другой ориентированный на строку инструмент для исключения строк из входного потока при помощи списка строк, обеспеченных как временный файл.
sed 's/ /\n/g'
преобразовывает пробелы в новые строки
grep -v
исключает условие фильтра из входного потока
grep-f
использует список условий/строк из обеспеченного файла
<( ... )
создайте дескриптор файла из вывода подпроцесса
tr '\n' ' '
преобразовывает новые строки назад в пробелы. Однако не будет никакой строки в конце, таким образом, мы добавим запаздывающее эхо.
То же самое может быть достигнуто с помощью [g] AWK, поскольку это имеет встроенные карты. Необходимо будет установить разделитель записей для интервала.
и при использовании обновленного примера мы добираемся:
>cat file1
eipassoc-03cd9117d7188d2 eipasoc-47367a3f eipasoc-bbbddc3 eipassoc-10bbfb6
>cat file2
eipasoc-47367a3f eipassoc-10bbfb6
>cat file1 | sed 's/ /\n/g' |grep -vf <(cat file2|sed 's/ /\n/g') | tr '\n' ' '; echo
eipassoc-03cd9117d7188d2 eipasoc-bbbddc3
>
>
Если Вы склонны использовать AWK, вот пример:
>cat file1
eipassoc-03cd9117d7188d2 eipasoc-47367a3f eipasoc-bbbddc3 eipassoc-10bbfb6
>cat file2
eipasoc-47367a3f eipassoc-10bbfb6
>cat file1 | sed 's/ /\n/g' |grep -vf <(cat file2|sed 's/ /\n/g') | tr '\n' ' '; echo
eipassoc-03cd9117d7188d2 eipasoc-bbbddc3
>
>
Здесь я использую взлом, чтобы рассматривать первый файл как поиск (НОМЕР == FNR) и сохранить чтение строк в карте, и затем непервые файлы будут проверены по поиску. Вы получаете рекордное разделение бесплатно, но код становится неясным, потому что это зависит от побочных эффектов
$ ID= (описывать-адреса aws ec2 - регион us-west-2 - запрашивают 'Адреса [].AssociationId []' - синтезируемый текст>> AId.txt),
$ IP= (описывать-адреса aws ec2 - регион us-west-2 - запрашивают 'Адреса [].PublicIp []' - синтезируемый текст>> OIP.txt),
считайте массив-a <<<$ (кошка AId.txt)
сенсорный NR.txt
поскольку я в $ {массив};
сделать
$ эха (описывать-адреса aws ec2 - регион us-west-2 - фильтрует "Name=association-id, $i Values=" - запрос 'Адреса [].PublicIp []' - синтезируемый текст),>> NR.txt
готово
считайте-a array1 <<<$ (кошка OIP.txt)
сенсорный RIps.txt
поскольку я в $ {array1};
сделать
$i эха>> RIps.txt
готово
$ l1= (сокращает-d" "-f 1-RIps.txt),
$ l2= (сокращает-d" "-f 1-NR.txt),
повторите "$ {l1}" "$ {l2}" | TR '''\n' | вид | uniq-u | xargs-L 2> result.txt
все ответы, данные предыдущим, корректны, кроме моего файла, который я загружал, имеет неизвестные символы, который является, почему я пытался хранить их в файле линию за линией вместо всего в одной строке. и затем код работал. спасибо всем.