Разбор нескольких файлов CSV в bash по шаблону со счетчиком - PullRequest
0 голосов
/ 09 января 2020

С Новым Годом

Я довольно новичок в bash написании сценариев и мне трудно объединять все части вместе.

Давайте предположим, что у меня есть файлы

  • report-x-1.csv
  • report-x-2.csv
  • report-x-3.csv
  • report-y-1.csv
  • report-y-2.csv
  • report-y-3.csv

Теперь я хочу получить последнее значение второго столбца с небольшим форматированием чего я достиг здесь

 awk -v max=0 '{if($1>max){want=$2; max=$1}}END{print "x:";print want} ' report-x-1.csv >> test.txt

Как мне это сделать с любым количеством файлов .csv и счетчиком сверху?

awk -v max=0 '{if($1>max){want=$2; max=$1}}END{print "x:";print want} ' report-x-* >> test.txt

только что-то делает для первого файл.

В конце концов мне нужен .csv как этот, но с любым количеством входных файлов:

x1 , 300
x2 , 250
x3 , 300
y1 , 270
y2 , 250
y3 , 280

Заранее спасибо

РЕДАКТИРОВАТЬ : Я еще не попробовал каждую идею в деталях, чтобы прояснить это, вот два примера файлов

https://pastebin.com/VMb32ULc

https://pastebin.com/qXQnagQ9

Эти файлы могут называться report-x-1.csv и report- y-1.csv и выходной файл должны содержать две строки x-1: 156. ... и y-1: 300. .... (что является последней строкой второго столбца) Решение должно работать с несколькими входными файлами как упомянуто выше

Ответы [ 3 ]

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

Не могли бы вы попробовать следующее. Так как образцы не даны, так что не смог проверить Но это должно быть быстрее, чем for l oop, который проходит через все CSV-файлы и вызывает awk в каждой итерации.

Ниже приведены пункты, которые учитываются в этой программе:

  • НЕТ необходимости использовать for l oop для Обход файлов .csv, поскольку awk способен на это.
  • Код OP НЕ заботится о получении значений x, y из имен файлов. Я добавил, что logi c тоже .
  • Можно также настроить имя выходного файла в разделе кода BEGIN по необходимости.


awk -v max=0 '
BEGIN{
  OFS=" , "
  output_file="output.txt"
}
FNR==1{
  if(want){
    print output":"ORS want > (output_file)    
  }
  split(FILENAME,array,"[-.]")
  output=array[2] array[3]
  want=max=""
}
{
  if($1>max){
    want=$2
    max=$1
  }
}
END{
  print output":"ORS want > (output_file)
}
' *.csv

Опечатка исправлена ​​с помощью OP

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

Может быть, пытается что-то вроде:

for file in $(ls)
do
    echo 'Doing something to file:' $file
    awk -v max=0 '{if($1>max){want=$2; max=$1}}END{print "x:";print want} ' $file >> test.txt
done

Или, может быть:

for file in $(ls)
do
    if [[ $file == *.csv ]]; then
        echo 'Doing something to file:' $file
        awk -v max=0 '{if($1>max){want=$2; max=$1}}END{print "x:";print want} ' $file >> test.txt
    fi
done
0 голосов
/ 09 января 2020

Чтобы запустить скрипт для каждого файла в каталоге, вы можете использовать pipep имена файлов и использовать xargs -n1:

echo report-x-*.csv | xargs -n1 awk -v max=0 '{if($1>max){want=$2; max=$1}}END{print "x:";print want}' >> test.txt
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...