2013-04-12 2 views
0

Итак, я хочу разбить довольно большой файл на несколько маленьких, основанных на 8-м столбце. Так что я написал этот сценарий:Bash разделил большой файл на более мелкие файлы

#!/bin/bash 
run_command(){ 
eval ${1} 
wait 
} 
chInput=("1" "2" "3" "4" "5" "6" "7" "8" "9" "10" "11" "12" "13" "14" "15" "16" "17" "18" "19" "Z" "T" "G" "F" "A" "D" "P") 
sampInput=("heyA") 

for ((x=0;x<${#chInput[@]};x++));do 
com="awk -F'\t' '$8=="${chInput[x]}"' /home/location/"$sampInput"_This_P.txt > "$sampInput"Ch"${chInput[x]}".txt" 
run_command "${com}" 
done 

Но он не работает из-за

«$ 8 ==»

awk: ==1 
awk:^syntax error 
awk: ==2 
awk:^syntax error 
awk: ==3 
awk:^syntax error 
awk: ==4 
awk:^syntax error 

Но только делает

awk -F'\t' '$8==1' /home/location/heyA_This_P.txt > Ch1.txt 

из командной строки действительно работа

Что можно сделать, чтобы исправить эту проблему?

ответ

2

Острая проблема - двойные кавычки; $8 будет заменено чем-то (возможно, вообще ничего) в момент назначения переменной. Вы можете попытаться использовать одинарные кавычки с правильным экранированием, но реальное решение, вероятно, состояло бы в том, чтобы сделать глубокий вдох и начать с нуля, не имея ни eval, ни сценария Awk в переменной.

В чем же цель этой логики кренделя? Вы, вероятно, следует читать и принимать близко к сердцу, совет в http://mywiki.wooledge.org/BashFAQ/050

Вот быстрый попытка решить вашу проблему:

#!/bin/bash 

chInput=("1" "2" "3" "4" "5" "6" "7" "8" "9" "10" "11" "12" "13" "14" "15" "16" "17" "18" "19" "Z" "T" "G" "F" "A" "D" "P") 
sampInput=("heyA") 

for ((x=0;x<${#chInput[@]};x++));do 
    awk -F'\t' '$8=="'"${chInput[x]}"'"' /home/location/"$sampInput"_This_P.txt > "$sampInput"Ch"${chInput[x]}".txt 
done 

Обратите внимание, в частности, конструкция для интерполирования "${chInput[X]}" в сценарий (это на самом деле единственное, что я изменил, фактически, кроме удаления переменной и вещей eval). Это строка в одинарных кавычках, рядом со строкой в ​​двойных кавычках, рядом со строкой в ​​одинарных кавычках, которые оцениваются одной строкой в ​​Bash. Таким образом, 'foo'"bar"'baz' оценивает по методу foobarbaz и аналогичным образом '"foo"' находится рядом с "'bar'" делает оценку "foo"'bar'. Здесь '$8=="', смежный с "${chInput[x]}", смежный с '"', принимает значение $8=="...", где материал в двойных кавычках заменяется во время назначения.

(Вы действительно не нужен массив, или,. Вы можете просто сделать

for c in "1" "2" "3" "4" "5" "6" "7" "8" "9" "10" "11" "12" \ 
     "13" "14" "15" "16" "17" "18" "19" "Z" "T" "G" "F" \ 
     "A" "D" "P" 
do 
    awk -F'\t' '$8=="'"$c"'"' /home/location/"$sampInput"_This_P.txt > "${sampInput}Ch$c.txt" 
done 

и быть совместим с классической Bourne оболочкой)

+0

Причины я пытался это потому, что я бегу сравнение этого файла с другим, и программа зависала в этом файле из-за его размера. Я хотел поиграть и посмотреть, могу ли я взять ленивый выход и разделить файл, а не переписать какой-то код. Я прочитал несколько статей, в которых говорилось, что это сработает, некоторые из них сказали, что это не так, и я хотел сам убедиться – Stephopolis

Смежные вопросы