Это исключительно поведение средства просмотра CVS, которое вы используете. Я могу воспроизвести ту же проблему с MS Excel.
awk -F "," '{print "=\""$1"\","$2}' test.csv > test3.csv
=
заставит данные быть текстовыми. Для редактирования файла.
echo "$(awk -F "," '{print "=\""$1"\","$2}' test.csv)" > test.csv
Вы преобразовали 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
Для этого можно использовать 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"
должен выполнить эту работу?
привет
Без каких-либо изменений в вашем потоке нижеследующее должно работать. Обратите внимание, что вы ничего не вводили в первую команду 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