AWK代码丢弃换行符

时间:2015-03-23 21:24:18

标签: bash shell awk formatting

我正在尝试删除日期函数的新行字符,并让它包含空格。我用这个保存变量:

current_date=$(date "+%m/%d/%y AT %H:%M:%S" )

我需要将日期保留在当前文本行中,除非另有说明,否则不要继续使用换行符。

current_date=$(date "+%m/%d/%y AT %H:%M:%S" )    
awk '(++n==2) {print "1\nData \nAccount '$current_date' Terminated;     n=0} (/blah/) {n=0} {print}' input file > output file

输入:

Line 1
Line 2
Line 3

输出:

Line 1
Line 2
Data
Account '$current_date' 
Terminated 
Line 3

期望的输出:

Line 1
Line 2
Data
Account '$current_date' Terminated 
Line 3

2 个答案:

答案 0 :(得分:2)

不是尝试使用shell语法将shell变量放入awk代码中,而是简单地将shell变量分配给带有-v选项的awk变量更简单,更安全:

$ awk -v d="$current_date" '{print} (++n==2) {printf "Data \nAccount %s Terminated\n",d; n=0} (/blah/) {n=0}' file 
Line 1
Line 2
Data 
Account 03/23/15 AT 14:34:10 Terminated
Line 3

从变量current_date

中删除多余的换行符

假设我们向current_date添加了多余的换行符:

current_date=$(date "+%m/%d/%y AT%n %H:%M:%S%n%n" )

我们可以按照以下方式删除它们:

$ awk -v d="$current_date" 'BEGIN{sub(/\n/,"",d)} {print} (++n==2) {printf "Data \nAccount %s Terminated\n",d; n=0} (/blah/) {n=0}' file 
Line 1
Line 2
Data 
Account 03/23/15 AT 15:41:17 Terminated
Line 3

答案 1 :(得分:0)

我必须在你的awk命令中添加3个双引号:

awk '(++n==2) {print "1\nData \nAccount '"$current_date"' Terminated";     n=0} (/blah/) {n=0} {print}' foo.txt

当您关闭单引号并在$current_date之前和之后重新打开它时,您需要在变量周围放置双引号,以便将标记围绕空格保持在一起。然后在终止后需要另一个引号来完成字符串。

我应该补充一点,在我做出这些更改之前我遇到了语法错误,所以也许还有其他事情发生......