在同一行Bash中回显多个变量

AS0*_*207 6 linux bash hadoop echo

我想在同一行回应两个变量.
我想将2015-03-04.01.Abhi_Ram.txt存储在变量FILENAME中,将10存储在变量COUNT中并同时回显它们.

Sample.txt的

2015-03-04.01.Abhi_Ram.txt 10
2015-03-04.02.Abhi_Ram.txt 70

以下是我提出的代码:

for line in `hadoop fs -cat sample.txt`
do

VAR="${line}"
FILENAME=`echo ${VAR}|awk '{print $1}'`
COUNT=`echo ${VAR}|awk '{print $2}'`
COUNT_DT=`date "+%Y-%m-%d %H:%M:%S"`
echo db"|"Abhi_Ram"|"record_count"|"${FILENAME}"||"${COUNT}"||"${COUNT_DT} >> output.txt
done

I want the output as:
Run Code Online (Sandbox Code Playgroud)

db | Abhi_Ram | record_count | 2015-03-04.01.Abhi_Ram.txt || 10 || timestamp db | Abhi_Ram | record_count | 2015-03-04.02.Abhi_Ram.txt || 70 || timestamp

I'm getting the output as:
Run Code Online (Sandbox Code Playgroud)

db | Abhi_Ram | record_count | 2015-03-04.01.Abhi_Ram.txt |||| timestamp
db | Abhi_Ram | record_count | 10 |||| timestamp
db | Abhi_Ram | record_count | 2015-03-04.02.Abhi_Ram.txt ||| | timestamp
db | Abhi_Ram | record_count | 70 |||| timestamp

有人能指出我错过了什么吗?

Joh*_*024 9

考虑:

while read filename count
do
    count_dt=$(date "+%Y-%m-%d %H:%M:%S")
    echo "db|Abhi_Ram|record_count|${filename}||${count}||${count_dt}"
done <sample.txt >>output.txt
Run Code Online (Sandbox Code Playgroud)

这会生成文件:

$ cat output.txt 
db|Abhi_Ram|record_count|2015-03-04.01.Abhi_Ram.json||10||2015-08-10 14:42:39
db|Abhi_Ram|record_count|2015-03-04.02.Abhi_Ram.json||70||2015-08-10 14:42:39
Run Code Online (Sandbox Code Playgroud)

笔记:

  1. 最佳做法是对shell变量使用lower或mixed case.系统使用大写变量,您不希望意外覆盖一个变量.

  2. echo声明中的许多双引号是不必要的.整个输出字符串可以在一个双引号字符串中.

  3. 如果要一次读取一行文件,则使用该while read ... done <inputfile构造会更安全.该read语句还允许我们轻松定义filenamecount变量.

  4. 对于命令替换,许多人更喜欢$(...)使用反引号形式的表单.这是因为(a)$(...)命令替换的开始和结束在视觉上是不同的,(b)$(...)形式嵌套好,并且(c)并非所有字体都清楚地显示反向标记与常规标记不同.(谢谢切普纳.)

  5. 为了提高效率,重定向output.txt已移至循环结束.这样,文件只能打开和关闭一次.(谢谢Charles Duffy.)

  6. 除非您需要count_dt更新每个单独的条目,否则它可以放在循环之前,并且每次sample.txt处理时只设置一次.如果您有最新版本的bash(没有Mac OSX),则count_dt可以使用本机bash语句替换分配(感谢Charles Duffy)(不需要炮轰):

    printf -v count_dt '%(%Y-%m-%d %H:%M:%S)T'
    
    Run Code Online (Sandbox Code Playgroud)