将变量内容添加到文件中的新列

Add variable content to a new column in file

我没有太多使用 UNIX 的经验,我想知道如何做到这一点:

我有一个包含以下内容的 bash 变量:

82 195 9 53

当前文件看起来像:

A
B
C
D

我想向包含该数字的文件添加一个新列,如下所示:

A 82
B 195
C 9
D 53

希望你能帮助我。提前致谢。

使用 bash 和一个数组:

numbers="82 195 9 53"
array=($numbers)
declare -i c=0         # declare with integer flag

while read -r line; do
  echo "$line ${array[$c]}"
  c=c+1
done < file

输出:

A 82
B 195
C 9
D 53

一个想法使用 awk:

x='82 195 9 53'

awk -v x="${x}" 'BEGIN { split(x,arr) } { print [=10=],arr[FNR] }' file.txt

其中:

  • -v x="${x}" - 传递 OS 变量 "${x}" 作为 awk 变量 x
  • split(x,arr) - 将 awk 变量 x 拆分为数组 arr[](默认分隔符为 space);这会给我们 arr[1]=82arr[2]=195arr[3]=9arr[4]=53

这会生成:

A 82
B 195
C 9
D 53


问题已用 windows-subsystem-for-linux 标记。

如果输入文件有 Windows/DOS 行结尾 (\r\n),建议的 awk 解决方案可能会生成不正确的结果,例如:

 82       # each line
 195      # appears
 9        # to begin
 53       # with a space

在这种情况下,OP 有几个选项:

  • 在调用 awk 运行 dos2unix file.txt 转换为 unix 行引擎 (\n) 或 ...
  • 之前
  • awk/BEGIN 块更改为 BEGIN { RS="\r\n"; split(x,arr) }

具有 mapfile 又名 readarray,这是一个 bash4+ 特性。

#!/usr/bin/env bash

##: The variable with numbers
variable='82 195 9 53'

##: Save the the variable into an array named numbers
mapfile -t numbers <<< "${variable// /$'\n'}"

##: Save the content of the file into an array named file_content
mapfile -t file_content < file.txt

##: Loop through the indices of both the arrays and print them side-by-side
for i in "${!file_content[@]}"; do
  printf '%s %d\n' "${file_content[i]}" "${numbers[i]}"
done

或者简单地使用带有 space 作为分隔符的粘贴,例如在 file:

中包含您的示例文件内容
var="82 195 9 53"
paste -d ' ' file <(printf "%s\n" $var)

(注意: $var在过程中使用未引用-替换为printf)

结果

A 82
B 195
C 9
D 53

注意一般的 POSIX shell 解决方案,您只需将 printf 的输出通过管道传输到 paste 而不是仅使用 bash进程替换,例如

printf "%s\n" $var | paste -d ' ' file -