awk выводит неверную переменную в файл - PullRequest
1 голос
/ 17 марта 2020

Цель

Я пытаюсь разбить дату, показанную в поле 2, на переменную «год и месяц», которые затем печатаются обратно в мой файл как 2 новых поля в конце. для l oop, поскольку я делаю много файлов, которые в конце будут cat'd.

Issue

AWK печатает поле 3 для одной из переменных и пустое поле для другого в конце файла.

file - test.tsv

client  2020-03-15  platform    3096431 2686357 0.868   2544716 0.8220000000000001  2509205 0.8100000000000001  2046915 0.6609999999999999  0.189   0.053   0.0526  0   0.0001  0   0.013   0.009599999999999999    0   0.0031  0   0   0.0005999999999999999   0.37    0.0757  0   0.0365  0.2326  0.025   1238347 0.494   0.494   1270858 0.507   0   0   1   0.302   33  202.5   1270864 0.507   157387  0.063   357414  0.142   723540  0.288

Код

 ##note the tabs in the cut command are correct in my code but might end up as spaces in the post
    for f4 in $(find *.tsv);do
            name=$(echo $f4 | sed -Ee 's/-filename.tsv//')
            month=$(cat $f4 | cut -d "      " -f 2 | awk -F"-" -v OFS='-' '{print $2}')
            year=$(cat $f4 | cut -d "       " -f 2 | awk -F"-" -v OFS='-' '{print $1}')
            awk -v month="$month" -v year="$year" -F"\t" -v OFS='\t' '{print $0,  $month,   $year}' $f4 > $name-dates.tsv
            mv $f4 tsv
    done

Токовый выход

client  2020-03-15  platform    3096431 2686357 0.868   2544716 0.8220000000000001  2509205 0.8100000000000001  2046915 0.6609999999999999  0.189   0.053   0.0526  0   0.0001  0   0.013   0.009599999999999999    0   0.0031  0   0   0.0005999999999999999   0.37    0.0757  0   0.0365  0.2326  0.025   1238347 0.494   0.494   1270858 0.507   0   0   1   0.302   33  202.5   1270864 0.507   157387  0.063   357414  0.142   723540  0.288   platform

Требуемый вывод

client  2020-03-15  platform    3096431 2686357 0.868   2544716 0.8220000000000001  2509205 0.8100000000000001  2046915 0.6609999999999999  0.189   0.053   0.0526  0   0.0001  0   0.013   0.009599999999999999    0   0.0031  0   0   0.0005999999999999999   0.37    0.0757  0   0.0365  0.2326  0.025   1238347 0.494   0.494   1270858 0.507   0   0   1   0.302   33  202.5   1270864 0.507   157387  0.063   357414  0.142   723540  0.288   03  2020

То, что я пробовал

Множество гуглов и множество доработок для сценария, но мне кажется, что я не могу сделать это правильно. по моим переменным "месяц" и "год" я записываю правильный ввод, но что-то в команде awk не передает его правильно. Любое руководство будет с благодарностью.

1 Ответ

2 голосов
/ 17 марта 2020

Просто сделайте это за один звонок в awk:

$ awk 'BEGIN{FS=OFS="\t"} {split($2,d,/-/); print $0, d[2], d[1]}' test.tsv
client  2020-03-15      platform        3096431 2686357 0.868   2544716 0.8220000000000001  2509205 0.8100000000000001      2046915 0.6609999999999999      0.189   0.053       0.0526  0       0.0001  0       0.013   0.009599999999999999    0       0.0031      0       0       0.0005999999999999999   0.37    0.0757  0       0.0365  0.2326      0.025   1238347 0.494   0.494   1270858 0.507   0       0       1       0.302       33      202.5   1270864 0.507   157387  0.063   357414  0.142   723540  0.288       03      2020

См. Также почему-то-цикл-над-находит-вывод-плохая практика , https://mywiki.wooledge.org/Quotes и http://porkmail.org/era/unix/award.html для некоторых (но не всех) других проблем в вашем скрипте. Я настоятельно рекомендую вам запускать все сценарии, которые вы пишете с помощью shellcheck (например, https://www.shellcheck.net/), пока не поймете основы.

...