2016-12-05 26 views
1

我試圖解析50+在shell腳本文件中類似下面的單呼,如何獲得過去的文件長度限制?

 
for i in {0..49} 
do 
    _file_list="$_file_list $_srcdir01/${_date_a[$i]}.gz" 
done 
eval zcat "$_file_list" | awk '{sum += 1} END {print sum;}' 

但是當我這樣做,我得到的「文件名太長」錯誤與ZCAT。

我試圖在一次調用中這樣做的原因是據我所知,awk無法保留以前調用的信息。我必須仔細考慮整個列表(例如在該列表中查找唯一的單詞)

我也不想合併文件,因爲它們都是大文件。

是否有一個聰明的方法來解決這個問題?還是我需要拆分調用並寫出中間結果?

回答

4

你可以從一個環狀管直接:

for date in "${_date_a[@]}" 
do 
    zcat "$_srcdir01/$date.gz" 
done | awk '{sum += 1} END {print sum;}' 

在任何情況下,如張貼代碼不應該給這個錯誤。

由於您的例子是不完整的或自包含的,我添加了一些代碼來初始化數據文件進行測試:

$ cat testscript 
_srcdir01="./././././././././././././././././././" 
_date_a=(foo{0001..0050}) 
for file in "${_date_a[@]}" 
do 
    echo "hello world" | gzip > "$file.gz" 
done 

for i in {0..49} 
do 
    _file_list="$_file_list $_srcdir01/${_date_a[$i]}.gz" 
done 
eval zcat "$_file_list" | awk '{sum += 1} END {print sum;}' 

運行它產生一束測試數據並正確地求和的行數:

$ bash testscript 
50 

我可以重現您的問題,如果我例如除去eval

$ bash testscript 
(...)/foo0045.gz ./././././././././././././././././././/foo0046.gz ././././././. 
/././././././././././././/foo0047.gz ./././././././././././././././././././/foo0 
048.gz ./././././././././././././././././././/foo0049.gz ./././././././././././. 
/./././././././/foo0050.gz: file name too long 

所以,請仔細檢查您發佈的代碼是你運行代碼,你在試圖解決它使其他的幾次嘗試沒有之一。

+0

如果您刪除'eval',它會將整個事件作爲* single * filename而不是多個。 – o11c

+0

您可以用'awk'END {print NR}'替換'awk'{sum + = 1} END {print sum;}''或者甚至更好的替換'wc -l'。 –

+0

我的歉意。我確實有解決方案工作..但我喜歡循環解決方案中的zcat,因爲它更乾淨。我沒有看到任何最終結果的差異,但是在'$ list_of_files「 do zcat文件 done'和'zcat long_long_list_of files'中的文件之間是否存在背景行爲差異? – dorachan2010

-1
$ awk '{sum += 1} END {print sum}' files... 

會工作,但也許你只需要使用wc -l

手動建立文件列表是不必要的,

$ zcat path/to/files{1..49} | awk ... 

也能發揮作用。

+0

這顯然是一個很小的例子。 'awk'不能直接在壓縮文件上運行。 – o11c