Содержимое Cat в файлах .txt с общим именем шаблона в bash - PullRequest
0 голосов
/ 17 января 2020

У меня есть серия файлов .dat и серия файлов .txt, которые имеют общий шаблон сопоставления. Я хочу поместить содержимое файлов .dat в каждый соответствующий файл .txt с соответствующим шаблоном в имени файла в al oop. Вот примеры файлов:

xfile_pr_WRF_mergetime_regionA.nc.dat
xfile_pr_GFDL_mergetime_regionA.nc.dat
xfile_pr_RCA_mergetime_regionA.nc.dat
#
yfile_pr_WRF_mergetime_regionA.nc.dat
yfile_pr_GFDL_mergetime_regionA.nc.dat
yfile_pr_RCA_mergetime_regionA.nc.dat
#
pr_WRF_mergetime_regionA_final.txt
pr_GFDL_mergetime_regionA_final.txt
pr_RCA_mergetime_regionA_final.txt

До сих пор я пробовал следующее (я пытаюсь отследить содержимое всех файлов, начинающихся с "xfile", в соответствующий файл модели .txt.

#
find -name 'xfile*' | sed 's/_mergetime_.*//' | sort -u | while read -r pattern
    do  
        echo "${pattern}"*
        cat "${pattern}"* >> "${pattern}".txt   
    done

Ответы [ 3 ]

1 голос
/ 18 января 2020

Позвольте мне сделать некоторые предположения:

  • Все имена файлов содержат _mergetime_* подстроку.
  • pattern - это часть, такая как pr_GFDL, и она необходима для идентификации файл.

Тогда вы бы попробовали следующее:

declare -A map                  # create an associative array
for f in xfile_*.dat; do        # loop over xfile_* files
    pattern=${f%_mergetime_*}   # remove _mergetime_* substring to extract pattern
    pattern=${pattern#xfile_}   # remove xfile_ prefix
    map[$pattern]=$f            # associate the pattern with the filename
done

for f in *.txt; do              # loop over *.txt files
    pattern=${f%_mergetime_*}   # extract the pattern
    [[ -f ${map[$pattern]} ]] && cat "${map[$pattern]}" >> "$f"
done
0 голосов
/ 18 января 2020

Похоже на то, что вы просите:

concatxy.sh:

#!/usr/bin/env bash

# do not return the pattern if no file matches
shopt -s nullglob

# Iterate all xfiles
for xfile in "xfile_pr_"*".nc.dat"; do

  # Regex to extract the common filename part
  [[ "$xfile" =~ ^xfile_(.*)\.nc\.dat$ ]]

  # Compose the matching yfile name
  yfile="yfile_${BASH_REMATCH[1]}.nc.dat"

  # Compose the output text file name
  txtfile="${BASH_REMATCH[1]}_final.txt"

  # Perform the concatenation of xfile and yfile into the .txt file
  cat "$xfile" "$yfile" >"$txtfile"
done

Создание заполненных тестовых файлов:

preptest.sh:

#!/usr/bin/env bash

# Populating test files
echo "Content of xfile_pr_WRF_mergetime_regionA.nc.dat" >xfile_pr_WRF_mergetime_regionA.nc.dat
echo "Content of xfile_pr_GFDL_mergetime_regionA.nc.dat" >xfile_pr_GFDL_mergetime_regionA.nc.dat
echo "Content of xfile_pr_RCA_mergetime_regionA.nc.dat" >xfile_pr_RCA_mergetime_regionA.nc.dat
#
echo "Content of yfile_pr_WRF_mergetime_regionA.nc.dat" > yfile_pr_WRF_mergetime_regionA.nc.dat
echo "Content of yfile_pr_GFDL_mergetime_regionA.nc.dat" >yfile_pr_GFDL_mergetime_regionA.nc.dat
echo "Content of yfile_pr_RCA_mergetime_regionA.nc.dat" >yfile_pr_RCA_mergetime_regionA.nc.dat
#
#pr_WRF_mergetime_regionA_final.txt
#pr_GFDL_mergetime_regionA_final.txt
#pr_RCA_mergetime_regionA_final.txt

Проверка работоспособности

$ bash ./preptest.sh
$ bash ./concatxy.sh
$ ls -tr1
concatxy.sh
preptest.sh
yfile_pr_WRF_mergetime_regionA.nc.dat
yfile_pr_RCA_mergetime_regionA.nc.dat
yfile_pr_GFDL_mergetime_regionA.nc.dat
xfile_pr_WRF_mergetime_regionA.nc.dat
xfile_pr_RCA_mergetime_regionA.nc.dat
xfile_pr_GFDL_mergetime_regionA.nc.dat
pr_GFDL_mergetime_regionA_final.txt
pr_WRF_mergetime_regionA_final.txt
pr_RCA_mergetime_regionA_final.txt
$ cat pr_GFDL_mergetime_regionA_final.txt
Content of xfile_pr_GFDL_mergetime_regionA.nc.dat
Content of yfile_pr_GFDL_mergetime_regionA.nc.dat
$ cat pr_WRF_mergetime_regionA_final.txt
Content of xfile_pr_WRF_mergetime_regionA.nc.dat
Content of yfile_pr_WRF_mergetime_regionA.nc.dat
$ cat pr_RCA_mergetime_regionA_final.txt
Content of xfile_pr_RCA_mergetime_regionA.nc.dat
Content of yfile_pr_RCA_mergetime_regionA.nc.dat
0 голосов
/ 18 января 2020

Если я вас правильно понял, вам нужно следующее:

- xfile_pr_WRF_mergetime_regionA.nc.dat
- yfile_pr_WRF_mergetime_regionA.nc.dat
----> pr_WRF_mergetime_regionA_final.txt

- xfile_pr_GFDL_mergetime_regionA.nc.dat
- yfile_pr_GFDL_mergetime_regionA.nc.dat
----> pr_GFDL_mergetime_regionA_final.txt

- xfile_pr_RCA_mergetime_regionA.nc.dat
- yfile_pr_RCA_mergetime_regionA.nc.dat
----> pr_RCA_mergetime_regionA_final.txt

Итак, вот что вы хотите сделать в сценарии:

  1. Получить все .nc.dat файлы в каталог
  2. Извлечение pr_TYPE_mergetime_region из файла
  3. Добавление части _final.txt к выходному файлу
  4. Затем на самом деле перенаправить вывод cat в этот файл

Итак, я получил следующий код:

find *.dat | while read -r pattern
do
    output=$(echo $pattern | sed -e 's![^(pr)]*!!' -e 's!.nc.dat!!')

    cat $pattern >> "${output}_final.txt"
done

И вот файлы, с которыми я столкнулся:

pr_GFDL_mergetime_regionA_final.txt
pr_RCA_mergetime_regionA_final.txt
pr_WRF_mergetime_regionA_final.txt

Пожалуйста, позвольте Я знаю в комментариях, если я что-то неправильно понял или что-то пропустил.

...