我有一個包含以下資料的檔案
10.00 4.85 2.80
16.00 6.25 3.61
22.00 6.40 3.70
25.00 6.80 3.79
>
100.00 4.85 2.80
160.00 6.25 3.61
220.00 6.40 3.70
250.00 6.80 3.79
>
100.00 4.85 2.88
160.00 6.25 3.68
220.00 6.40 3.78
250.00 6.80 3.78
>
我想在for回圈中讀取/列印由>符號分隔的資料部分
我試過代碼
while read block
do
ccc=sed 's/.*[>] * //' $block
echo $ccc
done < filex
任何人都可以提出解決方案。在此先感謝。
uj5u.com熱心網友回復:
我不完全了解您要做什么。我看到由 分隔的多個資料部分>,所以我不知道“由 > 符號分隔的資料部分”是什么意思。
但是,讓我們檢查一下您的腳本,看看它為什么不起作用。希望你能從中得到一些啟發。
while read block
do
...
done < filex
將遍歷您的檔案。第一次迭代,block將包含
10.00 4.85 2.80
第二次迭代,塊將包含
16.00 6.25 3.61
等等。
然后,你寫:
ccc=sed 's/.*[>] * //' $block
在bash中,這意味著s/.*[>] * //使用ccc設定為sed和block作為引數的內容執行程式(三個引數,10.00和4.85第2.80一次迭代。這不是您想要的。您將收到錯誤訊息bash: s/.*[>] * //: No such file or directory,因為bash找不到該檔案。
要將命令的輸出放入變數中,請使用
ccc=$(sed .....)
sed將 STDIN 作為輸入,或者,如果指定,則使用命令列上的檔案。所以,
sed 's/.*[>] * //' $block
將sed查找檔案(再次回圈的第一次迭代10.00)4.85和2.80. sed不會使用 in$block作為輸入。如果要sed用作$block輸入,則應將其作為 STDIN 提供:
echo "$block" | sed '....`
或者
ccc=$(echo "$block" | sed '...')
最后是對模式的一些評論。
sed將,對于輸入中的每一行,'s/.*[>] * //'. 對于輸入的每一行,而不是任意的行塊。圖案的意思是:
/.*[>] * /
| | | |
| | | \- and a single space
| | \--- zero or more spaces
| \----- the character > The [ and ] are normally used to give a list of
| possible characters.
\------- zero or more characters
因此,任何包含零個或多個字符的行,后跟一個>,零個或多個空格,后跟一個空格,都將洗掉該行的那部分。即使我不明白你想要什么,那也可能不是。
uj5u.com熱心網友回復:
您可以通過將輸入分隔符設定為“>”來做到這一點,如下所示:
b=0; while read -d ">" blk ; do echo "block: $b"; echo $blk; ((b=b 1)); done < YOURFILE
樣本輸出
block: 0
10.00 4.85 2.80
16.00 6.25 3.61
22.00 6.40 3.70
25.00 6.80 3.79
block: 1
100.00 4.85 2.80
160.00 6.25 3.61
220.00 6.40 3.70
250.00 6.80 3.79
block: 2
100.00 4.85 2.88
160.00 6.25 3.68
220.00 6.40 3.78
250.00 6.80 3.78
如果您愿意,可以這樣寫:
b=0
while read -d ">" blk ; do
echo "block: $b"
echo $blk
((b=b 1))
done < YOURFILE
uj5u.com熱心網友回復:
只需使用 grep:
grep -v '^>$'
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/487322.html
上一篇:壓縮Docker映像中的大檔案夾然后在入口點中提取它們有什么缺點嗎?
下一篇:重命名部分目錄名稱?
