1

我正在寻求帮助从文件中读取文本并将其传递到带有空格的数组中。

我的文件是:

Pool    Library Name
Backup  Lib1    "Guru Singh"
clone   Lib2    Raju
Tape    Lib3    Deepak

我的代码是:

column=1
for arrayname in Pool Library Name; do
     mapfile -t "$arrayname" < <(awk "NR > 1 {print \$$column}" file.txt)
     ((column++))
done
echo ${Pool[@]}
echo ${Library[@]}
echo ${Name[@]}

输出是

[root@Server MM]#     echo ${Pool[@]}
Backup clone Tape
[root@Server MM]#     echo ${Library[@]}
Lib1 Lib2 Lib3
[root@Server MM]#     echo ${Name[@]}
" Raju Deepak

echo ${Name[@]}输入

我想要输出为

Guru Singh Raju Deepak

任何想法/帮助?

4

2 回答 2

0

一个名为的文件中的以下内容file.txt

以下代码行将输出如下:

awk '{ if ( NR!=1 ) { print $3 " " $4 } }' ORS=" " file.txt

输出:

"Guru Singh" Raju  Deepak

解释:

  1. if ( NR!=1 ): 表示不打印第一行
  2. { print $3 " " $4 }:如果需要,打印带有名称和扩展名的列,就像第一行一样。(如果文件中存在更多不同的案例,这是一个非常具体的解决方案,使用转义引号。)
  3. ORS=" ": 在单行中创建输出 ORS 代表输出记录分隔符,默认为 \n 或下一行,我们将其设置为空格或" "

如果您不想要输出中的引号,可以使用快速修复tr,例如:

awk '{ if ( NR!=1 ) { print $3 " " $4 } }' ORS=" " file | tr -d '"'

输出:

Guru Singh Raju  Deepak
于 2019-11-24T19:41:20.350 回答
0

由于awk脚本执行从文件中提取列,您可以扩展它以提取带引号的字符串。通常,使用 FPAT。这比 Inder 提议更复杂,但允许数据扩展,支持任何列中的空格。

另请注意,作为替代方案,如果您的输入数据包含空格,则最好使用不会出现在数据中的不同分隔符(例如,制表符 \t、冒号或类似的分隔符)。使用大多数 Unix 工具解析引用的文本不是“自然的”。

awk -v COL=$column -v 'FPAT=("[^"]*"|[^ ]*) *' 'NR>1 { v=$(COL) ; gsub(" *$", "", v) ; print v }' file.txt

稍微重新排列阅读可能更容易理解

column=1
for arrayname in Pool Library Name; do
     mapfile -t "$arrayname" <<< "$(awk -v COL=$column -v 'FPAT=("[^"]*"|[^ ]*) *' 'NR>1 { v=$(COL) ; gsub(" *$", "", v) ; gsub("\"", "", v) ; print v }' file.txt)"
     ((column++))
done
于 2019-11-24T19:50:51.423 回答