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''完全没有空白。如何将命令的输出保存到同一文件?