连接grep输出字符串(bash脚本)

时间:2013-03-17 15:32:49

标签: bash grep

我正在使用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

3 个答案:

答案 0 :(得分:1)

我对同样的问题感到疯狂。

真正的问题是你的“test.pdb”可能有一个错误的EOL(行尾)字符。

Linux EOL:LF(又名\ n)

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

这意味着echo和grep会出现这个额外字符(\ r)的问题,幸运的是tr,sed和awk正确管理它。

所以你也可以尝试:

DATA = $(grep'整体'test.pdb | sed -n -e“s /^.*= // p”| sed -e 2s / \ r $ $“”)

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

答案 1 :(得分:0)

试试这个:

SUFFIX=";0"
DATA="${DATA}${SUFFIX}"

答案 2 :(得分:0)

使用,我想它会更可靠,更清洁:

$ awk '$2=="overall"{print "Working code\nData: " $4 "\n" $4 ";0"}' file.txt
Working code
Data: 324.88
324.88;0