Заменить заголовок одного столбца на имя файла - PullRequest
1 голос
/ 26 мая 2019

У меня около 100 разделенных запятыми текстовых файлов с восемью столбцами.

Пример двух имен файлов:

sample1_sorted_count_clean.csv 
sample2_sorted_count_clean.csv

Пример содержимого файла:

Domain,Phylum,Class,Order,Family,Genus,Species,Count
Bacteria,Proteobacteria,Alphaproteobacteria,Sphingomonadales,Sphingomonadaceae,Zymomonas,Zymomonas mobilis,0.0
Bacteria,Bacteroidetes,Flavobacteria,Flavobacteriales,Flavobacteriaceae,Zunongwangia,Zunongwangia profunda,0.0

Для каждого файла я хотел бы заменить заголовок столбца «Count» на идентификатор образца, который содержится в первой части имени файла (sample1, sample2)

В конце заголовок должен затемвыглядит так:

Domain,Phylum,Class,Order,Family,Genus,Species,sample1

Если я использую свой код, заголовок выглядит так:

Domain,Phylum,Class,Order,Family,Genus,Species,${f%_clean.csv}
for f in *_clean.csv; do echo ${f}; sed -e "1s/Domain,Phylum,Class,Order,Family,Genus,Species,RPMM/Domain,Phylum,Class,Order,Family,Genus,Species,${f%_clean.csv}/" ${f} > ${f%_clean.csv}_clean2.csv; done

Я также пытался:

for f in *_clean.csv; do gawk -F"," '{$NF=","FILENAME}1' ${f}  > t && mv t ${f%_clean.csv}_clean2.csv; done

В этом случае «count» заменяется на полное имя файла, но теперь каждая строка столбца содержит имя файла.Значения счета больше не присутствуют.Это не то, чего я хочу.

У вас есть идеи, что еще я могу попробовать?Заранее большое спасибо!

Анна

1 Ответ

2 голосов
/ 26 мая 2019

Если вы в порядке с awk, не могли бы вы попробовать следующее.

awk 'BEGIN{FS=OFS=","} FNR==1{var=FILENAME;sub(/_.*/,"",var);$NF=var} 1' *.csv

РЕДАКТИРОВАТЬ: Поскольку OP просит, чтобы после 2-го подчеркивания все было удалено в имени файла, попробуйте выполнить следующее.

awk 'BEGIN{FS=OFS=","} FNR==1{split(FILENAME,array,"_");$NF=array[1]"_"array[2]} 1' *.csv

Объяснение: Добавление пояснения к приведенному выше коду здесь.

awk '                              ##Starting awk program from here.
BEGIN{                             ##Starting BEGIN section of code from here, which will be executed before Input_file(s) are being read.
  FS=OFS=","                       ##Setting FS and OFS as comma here for all files all lines.
}                                  ##Closing BEGIN section here.
FNR==1{                            ##Checking condition if FNR==1 which means very first line is being read for Input_file then do following.
  split(FILENAME,array,"_")        ##Using split of awk out of box function by splitting FILENAME(which contains file name in it) into an array named array with delimiter _ here.
  $NF=array[1]"_"array[2]          ##Setting last field value to array 1st element underscore and then array 2nd element value in it.
}                                  ##Closing FNR==1 condition BLOCK here.
1                                  ##Mentioning 1 will print the rest of the lines for current Input_file.
' *.csv                            ##Passing all *.csv files to awk program here.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...