Arrays 在使用readarray时,如何避免数组元素后出现换行符?

Arrays 在使用readarray时,如何避免数组元素后出现换行符?,arrays,bash,Arrays,Bash,我有一个文本文件 Today, 12:34 Today, 21:43 Today, 12:43 https://123 https://456 https://789 想把每一行打印成一个数组。因此,我使用: readarray array <'file.txt' 使用“echo${array2[*]}打印整个array2会得到以下结果: Today, 12:34 https://123 Today, 21:43 https://456 Today, 12:43 https:/

我有一个文本文件

Today, 12:34 
Today, 21:43 
Today, 12:43
https://123
https://456
https://789
想把每一行打印成一个数组。因此,我使用:

readarray array <'file.txt'
使用“echo${array2[*]}打印整个array2会得到以下结果:

Today, 12:34
https://123
 Today, 21:43
https://456
 Today, 12:43
https://789
为什么元素之间有换行符,例如array2[0]和array2[1]之间?我怎样才能摆脱他们? 为什么在第二行和下面的几行中T前面有一个空格? 有没有可能在循环中编写上面的代码

亲切问候,,
X3nion

一个
awk
解决方案将更简单(更快)。只需将包含
“今日”
的所有行读入
awk
中的数组即可。然后从不包含
“Today”
的行开始,写出当前行,后跟数组中的关联行,例如

awk '/Today/{a[++n] = $0; next} {printf "%s\t%s\n", $0, a[++m]}' file.txt
示例使用/输出

使用
file.txt
中的示例行,您将收到:

$ awk '/Today/{a[++n] = $0; next} {printf "%s\t%s\n", $0, a[++m]}' file.txt
https://123     Today, 12:34
https://456     Today, 21:43
https://789     Today, 12:43
或者,如果您想更改订单:

$ awk '/Today/{a[++n] = $0; next} {printf "%s\t%s\n", a[++m], $0}' file.txt
Today, 12:34    https://123
Today, 21:43    https://456
Today, 12:43    https://789
根据评论添加内容

如果您使用
awk
在输出之前接收到空格,这是因为在第一个字段之前有空格。要消除空白,您可以强制
awk
重新计算每个字段,只需将字段设置为等于自身即可删除空白,例如

awk '{$1 = $1} /Today/{a[++n] = $0; next} {printf "%s\t%s\n", a[++m], $0}' file.txt
通过将第一个字段设置为自身相等(
$1=$1
),可以强制
awk
重新计算每个字段,从而消除前导空格。例如,数据前面有空格(每行前面有3个空格):

使用updated命令给出上面显示的答案,并删除空格

使用
粘贴

您可以将
粘贴
命令与
wc-l
(字数行)命令一起用作另一个选项。只需确定行数,然后使用过程替换输出前1/2行,然后输出最后1/2行,并将其与粘贴相结合,例如

$ lc=$(wc -l <file.txt); paste <(head -n $((lc/2)) file.txt) <(tail -n $((lc/2)) file.txt)
Today, 12:34    https://123
Today, 21:43    https://456
Today, 12:43    https://789

$lc=$(wc-l一个
awk
解决方案会简单得多(也快得多)。只需将包含
“今日”
的所有行读入
awk
中的一个数组中。然后从不包含
“今日”
的行开始写当前行,后跟数组中的关联行,例如

awk '/Today/{a[++n] = $0; next} {printf "%s\t%s\n", $0, a[++m]}' file.txt
示例使用/输出

使用
file.txt
中的示例行,您将收到:

$ awk '/Today/{a[++n] = $0; next} {printf "%s\t%s\n", $0, a[++m]}' file.txt
https://123     Today, 12:34
https://456     Today, 21:43
https://789     Today, 12:43
或者,如果您想更改订单:

$ awk '/Today/{a[++n] = $0; next} {printf "%s\t%s\n", a[++m], $0}' file.txt
Today, 12:34    https://123
Today, 21:43    https://456
Today, 12:43    https://789
根据评论添加内容

如果您使用
awk
在输出之前接收到空格,这是因为在第一个字段之前有空格。要消除空格,您可以强制
awk
重新计算每个字段,只需将字段设置为自身相等即可删除空格,例如

awk '{$1 = $1} /Today/{a[++n] = $0; next} {printf "%s\t%s\n", a[++m], $0}' file.txt
通过将第一个字段设置为等于自身(
$1=$1
),您可以强制
awk
重新计算每个字段,从而消除前导空格。例如,使用前导空格的数据(每行前面有3个空格):

使用updated命令给出上面显示的答案,并删除空格

使用
粘贴

您可以将
paste
命令与
wc-l
(字数行)命令一起用作另一个选项。只需确定行数,然后使用进程替换输出前1/2行,后接最后1/2行,并将其与
paste
组合,例如

$ lc=$(wc -l <file.txt); paste <(head -n $((lc/2)) file.txt) <(tail -n $((lc/2)) file.txt)
Today, 12:34    https://123
Today, 21:43    https://456
Today, 12:43    https://789

$lc=$(wc-l使用
-t
参数防止换行符包含在存储在单个数组元素中的数据中:

readarray -t array <file.txt

使用
-t
参数可防止在单个数组元素中存储的数据中包含换行符:

readarray -t array <file.txt

@很遗憾,printf命令不起作用,我得到了与上面相同的输出,但左边框和文本之间有一些空间。但是粘贴命令起作用了!如何将第一列和第二列之间的空间减少到0,1,…?如何将lc的输出重定向到同一文本文件?请参阅更新回答。如果您还有其他问题,请告诉我。我仍然有时间和https之间的空格。此外,我发现粘贴命令更好,因为日期不同(今天、昨天……)。如何使用粘贴命令消除时间和https之间的空白?您可以使用
paste-d'
使用单个空格作为分隔符。好的,粘贴-d''完全没有空白。如何将命令的输出保存到同一个文件?@DavidCRankin printf命令不幸不起作用,我得到了相同的结果输出如上所述,但左边框和文本之间有一些空间。但是粘贴命令可以工作!如何将第一列和第二列之间的空间减少到0,1,…?如何将lc的输出重定向到同一个文本文件?请参阅更新的答案。如果有其他问题,请告诉我。我仍然有白色的答案时间和https之间的空间。除此之外,我发现粘贴命令更好,因为日期不同(今天、昨天……)。如何使用“粘贴”命令消除时间和https之间的空白?您可以使用
paste-d'
使用单个空格作为分隔符。确定并粘贴-d''完全没有空白。如何将命令的输出保存到同一文件?