我正在编写一个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作为字符串,没有任何换行符。)
对不起,如果这看起来像一个简单的问题,但我已经谷歌搜索了几个小时,并尝试各种方式,我很难过。谢谢!
答案 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
这是未经测试的,但你应该明白这一点。