Надеюсь, кто-то в мире сможет мне помочь, а кому-то еще с похожей проблемой найти простое решение для сбора данных. Я потратил часы на то, чтобы решить один вопрос, и я решил, что это простая проблема, включающая awk, файл csv и сохранение вывода в виде переменной bash. Короче, вот гайка ...
Миссии:
1) Для вывода каждого другого столбца, начиная с ПОСЛЕДНЕЙ КОЛОННЫ, с определенным количеством итераций.
2) Чтобы вывести все остальные столбцы, начиная от СЛЕДУЮЩАЯ до ПОСЛЕДНЕЙ КОЛОННЫ, с определенным количеством итераций.
Данные (file.csv):
@12@SayWhat@2@4@2.25@3@1.5@1@1@1@3.25
@7@Smarty@9@6@5.25@5@4@4@3@2@3.25
@4@IfYouLike@4@1@.2@1@.5@2@1@3@3.75
@3@LaughingHard@8@8@13.75@8@13@6@8.5@4@6
@10@AtFunny@1@3@.2@2@.5@3@3@5@6.5
@8@PunchLines@7@7@10.25@7@10.5@8@11@6@12.75
Желаемые результаты для Миссии 1:
2@2.25@1.5@1@3.25
9@5.25@4@3@3.25
4@.2@.5@1@3.75
8@13.75@13@8.5@6
1@.2@.5@3@6.5
7@10.25@10.5@11@12.75
Желаемые результаты для Миссии 2:
SayWhat@4@3@1@1
Smarty@6@5@4@2
IfYouLike@1@1@2@3
LaughingHard@8@8@6@4
AtFunny@3@2@3@5
PunchLines@7@7@8@6
Мои попытки:
Закрытие, которое я пришел к решению любой из вышеперечисленных проблем, является уродливой трубкой (что нормально для снятия шкуры с кошки) для Миссии 1. Однако она не использует никаких заявленных итераций (должно быть 5). Кроме того, я полностью потерялся при решении Миссии 2.
Любая помощь, чтобы упростить нижеприведенное и решение Миссии 2, будет благодарна HELLA!
outcome=$( awk 'BEGIN {FS = "@"} {for (i = 0; i <= NF; i += 2) printf ("%s%c", $(NF-i), i + 2 <= NF ? "@" : "\n");}' file.csv | sed 's/@@.*//g' | awk -F@ '{for (i=NF;i>0;i--){printf $i"@"};printf "\n"}' | sed 's/@$//g' | awk -F@ '{$1="";print $0}' OFS=@ | sed 's/^@//g' );
Кроме того, если делать цикл дляопределенное количество итераций полезно для решения этой проблемы, тогда магическое число равно 5. Возможно, решением может быть цикл for, который считает справа налево и пропускает каждый второй столбец как 1 итерацию, причем начальный столбец объявлен как awkпеременная (просто мысль, что я не знаю, как это сделать)
Спасибо за просмотр этой проблемы.