2011-09-10 19 views
3

我正在编写一个bash脚本来解析标签分隔文本文件中的某些字段,并将它们附加到文件本身的文件名中。我可以使用awk解析字段,但它们附带了一个换行符。我想要从结果中删除这些换行符,或者理想地阻止awk将它们附加到第一位。只有回声出存储串的示例代码现在:如何防止awk将换行符附加到匹配项

#!/bin/bash 
echo "Usage: sh extract.sh filename.txt (or *.txt)" 

for filenam in "[email protected]" 
do 
timestring=$(awk 'BEGIN{ FS="\t"; RS="\n"; ORS="_"; OFS="_"} 
    /Conditions/ {printf $2} 
    /Date/ {printf $2} 
    /Time/ {printf $2} 
    END {}' $filenam) 
echo $timestring 

done 

目前,每次找到一个匹配,它将覆盖所有以前的比赛中,因为\ n附加到字符串的结尾。我如何防止这种情况发生? (这样我有conditions_date_time作为一个字符串,没有任何换行符)。

对不起,如果这看起来像一个简单的问题,但我一直在谷歌搜索几个小时,并尝试所有方式的事情,我很难过。谢谢!

回答

1

在您的脚本中,使用print而不是printf,例如, print $2

至于覆盖,如果您正在处理的文本文件有\r\n行尾,而不是\n,则可能发生这种情况。如果是这种情况,则将输入记录分隔符设置为\r\n,例如, RS="\r\n"

+0

这正是该行终止'做dos2unix \ r \ N',非常感谢您的洞察力!我应该知道它必须是一些简单的输入,我使用Google搜索并尝试了几个小时的示例代码。再次感谢! – catdotgif

0

尝试像

#!/bin/bash 
echo "Usage: sh extract.sh filename.txt (or *.txt)" 

for filenam in "[email protected]" 
do 
timestring=$(awk 'BEGIN{ FS="\t"; RS="\n"; ORS="_"; OFS="_"} 
    /Conditions/ { cond=$2 } 
    /Date/ { date=$2 } 
    /Time/ { time=$2 } 
    { if (length(cond) && length(date) && length(time)) { 
      print cond "_" date "_" time; 
      cond = ""; date=""; time="" 
     } 
    } 
    END {}' $filenam) 
echo $timestring 

done 

这是未经测试,但你应该明白我的意思。

1

你的文件传递给awk之前,对您的文件

+0

当然,这也会起作用。谢谢! – catdotgif