2013-05-24 3 views
1

У меня есть несколько файлов в папке, и мне нужно в первой строке каждой папкисохранить вывод файла Баш

transaction1.csv 
transaction2.csv 
transaction3.csv 
transaction4.csv 

и у меня есть следующий код

#All folders that begin with the word transaction 

folder='"transaction*"' 

ls `echo $folder |sed s/"\""/\/g` >testFiles 

# The number of lines of testFiles that is the number of transaction files 

num=`cat testFiles | wc -l` 

for i in `seq 1 $num` 
do 
    #The first transaction file 
    b=`cat testFiles | head -1` 

    #The first line of the first transaction file 
    cat `echo $b` | sed -n 1p 

    #remove the first line of the testFiles 
    sed -i '1d' testFiles 
done 

Этот код работает , проблема заключается в том, что мне нужно сохранить первую строку каждого файла в файле

и если я изменить строку:

cat `echo $b` | sed -n 1p > salida 

это не работы = (

+0

Просто поместите 'exec> salida' в самый верх скрипта. –

ответ

1

это AWK один вкладыш должен делать то, что вы хотите:

awk 'FNR==1{print > "output"}' *.csv 

первая строка каждого csv будут сохранены в файл: output

+0

, и если у меня есть сжатие всех файлов с bzip2, формат всех файлов - .csv.bz2, и если я делаю awk, это не работает, потому что команда не может распечатать файлы –

+0

ok, вы никогда не упоминали часть bz2. кто знает, что у вас есть это требование? если ваш файл зашифрован в gpg, ни один ответ здесь не работает. поэтому, извлеките пакет, а затем попробуйте ответы здесь. – Kent

3

В Баш:

for file in *.csv; do head -1 "$file" >> salida; done 

Как упоминал Адам в комментарии, у этого есть накладные расходы openin g файл каждый раз через цикл. Если вам нужно повысить производительность и эксплуатационная надежность следующее:

for file in *.csv; do head -1 "$file" ; done > salida 
+3

Или вместо '>> salida; done', вы можете использовать '; сделано> salida'. Таким образом, вы не будете открывать файл каждый раз через цикл, и вы замените файл (если, например, он был грязным с более ранней попытки), а не добавили к нему. –

+0

Хорошая точка @ AdamH.Peterson. Я добавлю это к ответу. –

+0

На боковой ноте: 'head -1' устарел, используйте' head -n 1'. –

0

Использование sed:

for f in *.csv; do sed -n "1p" "$f"; done >salida 
2
head -qn1 *.csv 

head -n1 напечатает первую строку каждого файла, и -q будет подавлять заголовок при более один файл указывается в командной строке.

=== Редактирование ===

Если файлы не сырой текст (например, если они сжаты с «bzip2», как mentinoned в вашем комментарии), и вы должны сделать некоторые нетривиальным preprocessing для каждого файла, вам, вероятно, лучше всего идти с циклом for. Например:

for f in *.csv.bz2 ; do 
    bzcat "$f" | head -n1 
done > salida 

(Другой вариант будет bunzip2 файлов, а затем head их в два этапа, такие как bunzip2 *.csv.bz2 && head -qn1 *.csv > salida, однако, это, конечно, изменить файлы на месте распаковка их, что, вероятно, нежелательно .)

+0

, и если я сжимаю все файлы с помощью bzip2, формат всех файлов - .csv.bz2, и если я делаю голову с bz2, это не сработает. –

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