У меня есть 50 текстовых файлов, которые выглядят так. Все имена файлов начинаются с ENSG00000...
"number" "variant_id" "gene_id" "tss_distance" "ma_samples" "ma_count" "maf" "pval_nominal""slope" "slope_se" "hg38_chr" "hg38_pos" "ref_allele" "alt_allele" "hg19_chr" "hg19_pos" "ID" "new_MAF" "CHROM" "POS" "REF" "ALT" "A1" "OBS_CT" "BETA" "SE" "P" "SD" "Variance"
"14" 6253456 "chr1_17726150_G_A_b38" "ENSG00000186715.10" 955913 68 78 0.0644628 0.895156 0.0139683 0.105945 "chr1" 17726150 "G" "A" "chr1" 18052645 "rs260514:18052645:G:A0.058155 1 18052645 "G" "A" "G" 1597 0.0147047 0.0656528 0.822804 2.62364886486368 6.88353336610048
Я хочу избавиться от речевых меток, окружающих каждое значение в файле, поэтому это выглядит так, как показано ниже. Я использую приведенный ниже сценарий, который работает, когда я пытаюсь использовать один файл.
number variant_id gene_id tss_distance ma_samples ma_count maf pval_nominal slope slope_se hg38_chr hg38_pos ref_allele alt_allele hg19_chr hg19_pos ID new_MAF CHROM POS REF ALT A1 OBS_CT BETA SE P SD Variance
14 6253456 chr1_17726150_G_A_b38 ENSG00000186715.10 955913 68 78 0.0644628 0.895156 0.0139683 0.105945 chr1 17726150 G A chr1 18052645 rs260514:18052645:G:A0.058155 1 18052645 G A G 1597 0.0147047 0.0656528 0.822804 2.62364886486368 6.88353336610048
Однако я хочу применить awk-скрипт ко всем 50 файлам через цикл. Однако, когда я использую приведенный ниже сценарий, я не получаю никаких результатов.
#!/bin/bash
#PBS -N Edit
#PBS -l walltime=01:00:00
#PBS -l nodes=1:ppn=8
#PBS -l vmem=10gb
#PBS -m bea
for i in ENSG00000*; do
awk '{ gsub(/"/, ""); print }' > $i.out
done
Вы забыли ввести awk
, например. awk '{ gsub(/"/, ""); print }' "${i}" > $i.out
Кстати (не связанный с вашим вопросом), вы также забыли уловить случай, что у вас нет файлов для обработки в вашем каталоге.
Вы забыли указать входной файл для сканирования awk. Пытаться:
for i in ENSG00000*; do
awk '{ gsub(/"/, ""); print }' $i > $i.out
done
Просто быстрое редактирование должно быть
для i в ENSG00000*; do awk '{gsub(/"/, ""); print }' "${i}" > "${i}"_out.txt готово
Возможно, это все, что вам нужно
sed -i '' 's/"//g' ENSG00000*
если вы хотите, чтобы файл редактировался на месте.
Использование awk только для удаления определенных символов — это излишество. Почему бы вам просто не сделать
tr -d '"' <$i >$i.out
?
Предлагаю скрипт awk
без зацикливания:
awk -i inplace '{ gsub(/"/, ""); print }' ENSG00000*
Но решение sed
выше является лучшим:
sed -i '' 's/"//g' ENSG00000*
пожалуйста, обновите вопрос, чтобы показать ваш
awk
вызов для одного файла