Разбейте строку на два массива, используя awk / sed / grep - PullRequest
0 голосов
/ 05 февраля 2019

Создайте два разных массива в сценарии shell / bash из содержимого в текстовом файле, в котором есть сведения о разных файлах.Как извлечь каталоги в один массив и имена файлов в другой массив, используя awk / sed / grep?

У меня есть текстовый файл, как показано ниже

    2017-02-04      07:18   /temp/folder1/filename_20170204_something.txt  
    2017-03-04      07:18   /temp/folder2/filename_20170204_20170304.txt  
    2017-04-04      07:18   /temp/folder3/filename_20170404_.txt    
directories_list= {folder1,folder2,folder3}  
file_list = {filename_20170204.txt,filename_20170304.txt,filename_20170404.txt}

Ответы [ 3 ]

0 голосов
/ 05 февраля 2019

Прочитайте файл построчно, разделите его read и IFK, используйте basename и dirname и прочитайте в массиве:

cat <<EOF >file
    2017-02-04      07:18   /temp/folder1/filename_20170204_something.txt  
    2017-03-04      07:18   /temp/folder2/filename_20170204_20170304.txt  
    2017-04-04      07:18   /temp/folder3/filename_20170404_.txt    
EOF

dirs=() files=()
while IFS=' ' read -r _ _ path; do
    dirs+=("$(basename "$(dirname "$path")")")
    files+=("$(basename "$path")")
done <file
declare -p dirs files
0 голосов
/ 05 февраля 2019

Как вы хотите обрабатывать дублирующиеся записи в массиве и существует ли какой-то определенный порядок, в котором вы хотите сохранить файлы.

Если нет, вы можете использовать приведенные ниже команды (( удаляет дубликаты).записи и сортировки на основе имен файлов )

folders=()
files=()

folders=`awk '{print $NF}' <INPUT_FILE> | awk -F'/' '{print $(NF-1)}' | sort -nr | uniq`
files=`awk '{print $NF}' <INPUT_FILE> | awk -F'/' '{print $NF}' | sort -nr | uniq`

Ниже приведено объяснение команд awk,

awk '{print $NF}' <INPUT_FILE> -> takes the last field in the input file
awk -F'/' '{print $(NF-1)}' -> cuts the last filed with / as delimiter and takes the penultimate column

Надеюсь, это поможет!

0 голосов
/ 05 февраля 2019

Я бы использовал awk, чтобы разбить строки на столбцы, затем print номер столбца для папки и номер столбца для файла.Вы можете сказать awk, что такое символ-разделитель с помощью опции -F.

Этот сценарий сохраняет папки в одном массиве, а файлы - в другом.

#!/bin/bash

FOLDERS=() # declares FOLDERS as an array
FILES=() # declares FILES as an array
INPUT=input.txt # change to the path of your data file

while read LINE
do
  FOLDER=$(echo $LINE | awk -F / '{print $3}')
  FILE=$(echo $LINE | awk -F / '{print $4}')
  echo "Reading next line..."
  echo FOLDER: $FOLDER
  echo FILE: $FILE
  echo ""
  FOLDERS+=( "$FOLDER" ) # appends $FOLDERS to the FOLDERS array
  FILES+=( "$FILE" ) # appends $FILE to FILES array
done < $INPUT

# Now the FOLDERS array and FILES array have what you want

echo FOLDERS array: ${FOLDERS[@]}
echo FILES array: ${FILES[@]}

Предполагается, что у вас есть файл input.txt в том же каталоге, и он содержит ваши образцы данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...