将变量内容添加到文件中的新列
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]=82
、arr[2]=195
、arr[3]=9
和 arr[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 -
我没有太多使用 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]=82
、arr[2]=195
、arr[3]=9
和arr[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 -