Редактировать столбец CSV через другой столбец - PullRequest
0 голосов
/ 19 октября 2019

У меня есть сценарий Bash, который запрашивает ввод для редактирования столбца CSV:

echo X, as recorded in TIFF header, to be removed:
read X
sed -i "" "/^[^,]*_f_[^,_]*,/s/,$X /,f. /
    s/,$X /,/" $pathToCSV".csv"

Теперь я хочу избежать ручного ввода по одному и вместо этого использовать другой столбецCSV (столбец C), который включает значение X для редактирования этого первого столбца. Таким образом, я могу пакетно сгенерировать эти CSV из заголовков TIFF, и мне не придется каждый раз вводить X (что отличается от одного CSV).

Я оглянулся и попробовал несколько вещей, в том числе:

X=$(awk 'NR == 2 {print $3}' $pathToCSV".csv")
sed -i "" "/^[^,]*_f_[^,_]*,/s/,$X /,f. /
    s/,$X /,/" $pathToCSV".csv"

Это не работает, и вывод по-прежнему включает X. (Столбец C содержит одинаковое значение во всех своих строках, и я использую C2 произвольно.)

Обновление 1 :

По запросу я вставляючасть моего CSV здесь:

/Volumes/Masters/DLTempSecure/EMEL_SLDP/201808/tiffs/arabic_0695/sld_arb0695_0001_a_1.tif   Si Ar 695 Front Board Outside   Si Ar 695
/Volumes/Masters/DLTempSecure/EMEL_SLDP/201808/tiffs/arabic_0695/sld_arb0695_0002_a_1a.tif  Si Ar 695 Front Board Outside   Si Ar 695
/Volumes/Masters/DLTempSecure/EMEL_SLDP/201808/tiffs/arabic_0695/sld_arb0695_0003_b_000.tif Si Ar 695 Front Board Inside    Si Ar 695
/Volumes/Masters/DLTempSecure/EMEL_SLDP/201808/tiffs/arabic_0695/sld_arb0695_0009_b_003v.tif    Si Ar 695 Flyleaf 003v  Si Ar 695
/Volumes/Masters/DLTempSecure/EMEL_SLDP/201808/tiffs/arabic_0695/sld_arb0695_0010_f_001r.tif    Si Ar 695 001r  Si Ar 695
/Volumes/Masters/DLTempSecure/EMEL_SLDP/201808/tiffs/arabic_0695/sld_arb0695_0060_y_001r.tif    Si Ar 695 Flyleaf 001r  Si Ar 695
/Volumes/Masters/DLTempSecure/EMEL_SLDP/201808/tiffs/arabic_0695/sld_arb0695_0070_y_999.tif Si Ar 695 Back Board Inside Si Ar 695
/Volumes/Masters/DLTempSecure/EMEL_SLDP/201808/tiffs/arabic_0695/sld_arb0695_0071_z_1.tif   Si Ar 695 Back Board Outside    Si Ar 695
/Volumes/Masters/DLTempSecure/EMEL_SLDP/201808/tiffs/arabic_0695/sld_arb0695_0072_z_1a.tif  Si Ar 695 Back Board Outside    Si Ar 695
/Volumes/Masters/DLTempSecure/EMEL_SLDP/201808/tiffs/arabic_0695/sld_arb0695_0073_z_2.tif   Si Ar 695 Spine Si Ar 695
/Volumes/Masters/DLTempSecure/EMEL_SLDP/201808/tiffs/arabic_0695/sld_arb0695_0074_z_3.tif   Si Ar 695 Fore edge Si Ar 695

Вместо того, чтобы вводить Si Ar 695 вручную (и некоторые другие значения для другого CSV), третий столбец следует использовать для удаления значения повтора с передней частивторой столбец.

Обновление 2 :

Команда awk, предложенная @anubhava, работает отлично:

awk 'BEGIN{FS=OFS=","} NF>2 && NR==1{s=$3} {sub("^" s "[[:blank:]]+", "", $2)} 1' $pathToCSV".csv"

Однако ятолько что вспомнил команду sed, которую я имел ранее, то есть

sed -i "" "/^[^,]*_f_[^,_]*,/s/,$X /,f. /
    s/,$X /,/" $pathToCSV".csv"

добавлял бы к моему второму столбцу f. всякий раз, когда имя файла в первом столбце включало _f_. Я думаю, что это должна быть корректировка регулярных выражений, но я пытаюсь реализовать это в приведенной выше команде awk.

Это входные данные:

/Volumes/Masters/DLTempSecure/EMEL_SLDP/201808/tiffs/arabic_0695/sld_arb0695_0010_f_001r.tif    Si Ar 695 001r  Si Ar 695
/Volumes/Masters/DLTempSecure/EMEL_SLDP/201808/tiffs/arabic_0695/sld_arb0695_0011_f_001v.tif    Si Ar 695 001v  Si Ar 695
/Volumes/Masters/DLTempSecure/EMEL_SLDP/201808/tiffs/arabic_0695/sld_arb0695_0012_f_002r.tif    Si Ar 695 002r  Si Ar 695
/Volumes/Masters/DLTempSecure/EMEL_SLDP/201808/tiffs/arabic_0695/sld_arb0695_0013_f_002v.tif    Si Ar 695 002v  Si Ar 695
/Volumes/Masters/DLTempSecure/EMEL_SLDP/201808/tiffs/arabic_0695/sld_arb0695_0014_f_003ar.tif   Si Ar 695 003r  Si Ar 695
/Volumes/Masters/DLTempSecure/EMEL_SLDP/201808/tiffs/arabic_0695/sld_arb0695_0015_f_003av.tif   Si Ar 695 003v  Si Ar 695
/Volumes/Masters/DLTempSecure/EMEL_SLDP/201808/tiffs/arabic_0695/sld_arb0695_0016_f_004br.tif   Si Ar 695 004r  Si Ar 695
/Volumes/Masters/DLTempSecure/EMEL_SLDP/201808/tiffs/arabic_0695/sld_arb0695_0017_f_004bv.tif   Si Ar 695 004v  Si Ar 695
/Volumes/Masters/DLTempSecure/EMEL_SLDP/201808/tiffs/arabic_0695/sld_arb0695_0018_f_005r.tif    Si Ar 695 005r  Si Ar 695

И это желаемый вывод:

/Volumes/Masters/DLTempSecure/EMEL_SLDP/201808/tiffs/arabic_0695/sld_arb0695_0010_f_001r.tif    f. 001r Sinai Arabic 695
/Volumes/Masters/DLTempSecure/EMEL_SLDP/201808/tiffs/arabic_0695/sld_arb0695_0011_f_001v.tif    f. 001v Sinai Arabic 695
/Volumes/Masters/DLTempSecure/EMEL_SLDP/201808/tiffs/arabic_0695/sld_arb0695_0012_f_002r.tif    f. 002r Sinai Arabic 695
/Volumes/Masters/DLTempSecure/EMEL_SLDP/201808/tiffs/arabic_0695/sld_arb0695_0013_f_002v.tif    f. 002v Sinai Arabic 695
/Volumes/Masters/DLTempSecure/EMEL_SLDP/201808/tiffs/arabic_0695/sld_arb0695_0014_f_003ar.tif   f. 003r Sinai Arabic 695
/Volumes/Masters/DLTempSecure/EMEL_SLDP/201808/tiffs/arabic_0695/sld_arb0695_0015_f_003av.tif   f. 003v Sinai Arabic 695
/Volumes/Masters/DLTempSecure/EMEL_SLDP/201808/tiffs/arabic_0695/sld_arb0695_0016_f_004br.tif   f. 004r Sinai Arabic 695
/Volumes/Masters/DLTempSecure/EMEL_SLDP/201808/tiffs/arabic_0695/sld_arb0695_0017_f_004bv.tif   f. 004v Sinai Arabic 695
/Volumes/Masters/DLTempSecure/EMEL_SLDP/201808/tiffs/arabic_0695/sld_arb0695_0018_f_005r.tif    f. 005r Sinai Arabic 695

Буду признателен за любую помощь с Обновление 2 !

Ответы [ 2 ]

3 голосов
/ 19 октября 2019

Вы можете использовать это awk:

awk 'BEGIN{FS=OFS=","} NR==2{s=$2} NR>1{sub("^" s "[[:blank:]]+", "")} 1' file.csv

$2,$3
Front Board Outside,Si Ar 695
Front Board Inside,Si Ar 695
Flyleaf 001r,Si Ar 695
Flyleaf 001v,Si Ar 695

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

awk 'BEGIN{FS=OFS="\t"} NF>2 && NR==1{s=$3} {sub("^" s "[[:blank:]]+", "", $2)} 1' file

Обновление 2:

В соответствии с вашим последним обновлением, вам нужно будет использовать следующую команду awk:

awk 'BEGIN{FS=OFS=","} NF>2 && NR==1{s=$3} {sub("^" s "[[:blank:]]+", "", $2)} $1 ~ /_f_/{$2 = "f. " $2} 1' file.csv
1 голос
/ 19 октября 2019

Используя ваши необработанные данные (https://pastebin.com/V9Jg4icj) и Миллер (https://github.com/johnkerl/miller) и работающие

mlr --nidx --fs tab cut -x -f 1 then put -S '$2=gsub($2,"^.+[0-9] ","")' input

), у вас будет

Front Board Outside     Si Ar 695
Front Board Outside     Si Ar 695
Front Board Inside      Si Ar 695
Flyleaf 001r    Si Ar 695
Flyleaf 001v    Si Ar 695
Flyleaf 002r    Si Ar 695
Flyleaf 002v    Si Ar 695
Flyleaf 003r    Si Ar 695
Flyleaf 003v    Si Ar 695
001r    Si Ar 695
001v    Si Ar 695
002r    Si Ar 695
002v    Si Ar 695
003r    Si Ar 695
003v    Si Ar 695
004r    Si Ar 695
004v    Si Ar 695
005r    Si Ar 695
005v    Si Ar 695
006r    Si Ar 695
006v    Si Ar 695
007r    Si Ar 695
007v    Si Ar 695
008r    Si Ar 695
008v    Si Ar 695
009r    Si Ar 695
...    ...
...    ...

Если вы хотитеВыход CSV

mlr --n2c --ifs tab cut -x -f 1 then put -S '$2=gsub($2,"^.+[0-9] ","")' input
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...