如何防止awk将新行添加到匹配项中

时间:2011-09-10 07:47:08

标签: bash scripting awk

我正在编写一个bash脚本来解析制表符分隔文本文件中的某些字段,并将它们附加到文件本身的文件名中。我可以使用awk解析这些字段,但是它们附加了换行符。我想从结果中删除这些换行符,或者理想的是阻止awk首先附加它们。现在只有存储字符串回显的示例代码:

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

for filenam in "$@"
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作为字符串,没有任何换行符。)

对不起,如果这看起来像一个简单的问题,但我已经谷歌搜索了几个小时,并尝试各种方式,我很难过。谢谢!

3 个答案:

答案 0 :(得分:1)

在您的脚本中,使用print代替printf,例如print $2

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

答案 1 :(得分:1)

在将文件传递给awk之前,请在您的文件上执行dos2unix

答案 2 :(得分:0)

尝试类似

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

for filenam in "$@"
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

这是未经测试的,但你应该明白这一点。