4

bash スクリプト (Ubuntu 12.10) を使用して、テキスト ファイルからデータを処理しています。

基本的な考え方は、grep を使用してファイルから特定の行を選択することです。次に、sed で番号を取得する行を処理します。grep コマンドと sed コマンドの両方が機能しています。番号をエコーできます。

しかし、結果と文字列の連結はうまくいきません。

変数またはファイルから grep コマンドを実行するときに文字列を結合すると、異なる結果が得られます。ファイルをgrepすると、連結がうまくいきません。ファイルと同じテキストで変数をgrepすると、期待どおりに機能します。

ファイルからのgrepで何が間違っていますか?

test.pdb の内容

REMARK overall = 324.88  
REMARK bon     = 24.1918  
REMARK coup    = 0  

私のスクリプト

#!/bin/bash

#Correct function
echo "Working code"
TEXT="REMARK overall = 324.88\nREMARK bon     = 24.1918\nREMARK coup    = 0\n"
DATA=$(echo -e $TEXT | grep 'overall' | sed -n -e "s/^.*= //p" )

echo "Data: $DATA"
DATA="$DATA;0"
echo $DATA


#Not working
echo ""
echo "Not working code"
DATA=$(grep 'overall' test.pdb | sed -n -e "s/^.*= //p")

echo "Data: $DATA"
DATA="$DATA;0"
echo $DATA

出力

Working code
Data: 324.88
324.88;0

Not working code
Data: 324.88
;04.88
4

3 に答える 3

2

私は同じ問題に夢中になりました。

本当の問題は、おそらく "test.pdb" の EOL (行末) 文字が間違っていることです。

Linux EOL: LF (別名 \n)

Windows EOL: CR LF (別名 \r \n)

これは、echo と grep がこの余分な文字 (\r) に問題があることを意味します。幸い、tr、sed、および awk は正しく処理されます。

したがって、次の方法でも試すことができます。

DATA=$(grep 'overall' test.pdb | sed -n -e "s/^.*= //p" | sed -e 2s/\r$//")

また

DATA=$(grep '全体' test.pdb | sed -n -e "s/^.*= //p" | tr -d '\r')

于 2015-03-26T12:46:02.410 に答える
0

これを試して:

SUFFIX=";0"
DATA="${DATA}${SUFFIX}"
于 2013-03-17T15:43:05.263 に答える
0

を使用すると、より信頼性が高く、よりクリーンになると思います。

$ awk '$2=="overall"{print "Working code\nData: " $4 "\n" $4 ";0"}' file.txt
Working code
Data: 324.88
324.88;0
于 2013-03-17T15:48:31.233 に答える