UNIX AIX использует массив для хранения имени и пути, а затем получает их отдельно, используя цикл for

Использование оболочки с заменой процесса (ksh93, bash,...)(см. конец для замены процесса -бесплатная альтернатива):

cat <( head -n 3 file1 ) \
    <( sort -k2,2n <( tail -n +4 file1 | tr -s ' ' '\t' ) \
                   <( tail -n +4 file2 | tr -s ' ' '\t' ) | uniq )

Это приведет к:

header 1
header 2
header 3

lemur   3       dd
alligator       4       ca
cat     4       aa
dog     5       ab
ostrich 10      cd
fish    13      cc
lemming 16      ad

Команда объединяет строки заголовков file1с результатом операции сортировки. Сортировка выполняется численно по второму полю некоторого ввода, и любые повторяющиеся строки (аллигаторы, лемуры и лемминги )удаляются с uniqиз результата.

Входными данными для сортировки будет заголовок -за вычетом содержимого как file1, так и file2, пропущенный через trдля замены последовательных пробелов одиночными вкладками (между столбцами было нечетное количество пробелов в примере данных ).

Результатом является табуляция -с разделителями.


Эквивалентный способ с использованием тех же инструментов:

cat <( head -n 3 file1 ) \
    <( sort -k2,2n <( cat <( tail -n +4 file1 ) \
                          <( tail -n +4 file2 ) | tr -s ' ' '\t' ) | uniq )

Без cats и замены процесса:

{ head -n 3 file1;
    { tail -n +4 file1; tail -n +4 file2; } | tr -s ' ' '\t' | sort -k2,2n | uniq; }
-1
10.10.2019, 17:01
1 ответ

я попробовал обходной путь, который, я думаю, я понимаю:

#put all the data inside 1 array
array1[0]="/Distenation1/File1.txt"
array1[1]="file1"
array1[2]="/Distenation2/File2.txt"
array1[3]="file2"

#create a counter    
n=0

#the trick here was that 'i' (loop) stores 1 array data per iteration (at first i thought it stores the whole array data then go through them 1 by one)
for i in ${array1[@]}
do
        if [ $1 = ${i} ]
        then
#here i had to call the original array to be able to read through any data inside the array
                echo Name : $i '\n' Path : ${array1[$n+1]}
        fi;

        let n=n+1
done;

ВЫХОД:

=>test1 file1
Name : file1
 Path : /Distenation1/File1.txt

Я не уверен, что это лучшая практика, но я открыт для любого лучшего решения или оптимизированного кода, поскольку я работаю с очень большим скриптом, и каждая миллисекунда оптимизации будет иметь значение

0
28.01.2020, 05:12

Теги

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