Запуск скрипта для списка файлов

Это исключительно поведение средства просмотра CVS, которое вы используете. Я могу воспроизвести ту же проблему с MS Excel.

awk -F "," '{print "=\""$1"\","$2}' test.csv > test3.csv
  • =заставит данные быть текстовыми.

Для редактирования файла.

echo "$(awk -F "," '{print "=\""$1"\","$2}' test.csv)" > test.csv
0
23.08.2020, 05:14
3 ответа

Вы преобразовали script "$f"в своем выводе Google в grep -v "#"(, т.е. пропустили"$f")в сценарии цикла оболочки, а затем используете "$f"вместо {}и используете его не в том месте в своем xargsсценарий.

Вам никогда не понадобится куча seds и greps в pipleine, если вы все равно используете awk. Вы не предоставили никаких примеров ввода/вывода, поэтому следующий awk-скрипт — это просто прямой перевод вашего существующего конвейера, и, вероятно, есть лучший способ его написать, но этот awk-скрипт — это все, что вам нужно, без циклов оболочки или чего-то еще.:

awk '
    FNR == 1 {
        close(out)
        out = FILENAME
        sub(/\.vcf$/,".txt",out)
    }
    !/#/ {
        sub(/chrM/,"MT")
        sub(/chrX/,"X")
        sub(/chrY/,"Y")
        $0 = $1 OFS $2 OFS $2 OFS $4 "/" $5 OFS "+"
        gsub(/chr/,"")
        print > out
    }
' *.vcf

Если вы хотите втиснуть его в меньшее количество строк, как вы сделали с конвейером grep+seds+awk, вы можете просто использовать точки с запятой везде, где есть новая строка, от которой вы хотите избавиться, кроме как после каждой {, например.:

awk 'FNR==1{close(out); out=FILENAME; sub(/\.vcf$/,".txt",out)} !/#/{sub(/chrM/,"MT"); sub(/chrX/,"X"); sub(/chrY/,"Y"); $0=$1 OFS $2 OFS $2 OFS $4 "/" $5 OFS "+"; gsub(/chr/,""); print > out}' *.vcf
0
18.03.2021, 23:10

Для этого можно использовать find и xargs.

Найти выведет список всех файлов.

find -type f -name "*.vcf"

С помощью xargs мы можем работать с каждым найденным файлом.

find -type f -name "*.vcf" | xargs grep -v "#" | sed 's/chrM/MT/' | sed 's/chrX/X/' | sed 's/chrY/Y/' | awk '{print $1,$2,$2,$4"/"$5,"+"}' | sed 's/chr//g' "$f" > "${f%.*}.txt"

должен выполнить эту работу?

привет

0
18.03.2021, 23:10

Без каких-либо изменений в вашем потоке нижеследующее должно работать. Обратите внимание, что вы ничего не вводили в первую команду grep в конвейере. Так что ничего не двигалось.

for f in *.vcf; do

< "$f"  grep -v "#" | sed 's/chrM/MT/' | sed 's/chrX/X/' | sed 's/chrY/Y/' | awk '{print $1,$2,$2,$4"/"$5,"+"}' | sed 's/chr//g'  > "${f%.*}.txt"
    done
0
18.03.2021, 23:10

Теги

Похожие вопросы