我正在寻找一种通过线上线打印的方法。
例如,我有以下变量A和B,其中包含:
| A | B |
| a | d |
| b | c |
| c | b |
| d | a |
我想要的是输出:
a d
b c
c b
d a
我尝试了
awk 'BEGIN {OFS=" "}{
getline line < "$A"
print $0,line
} ' "$B"
但这不起作用。
A和B是多线字符串。例如,A是A* n b n c n d n*
请不要"列"或"粘贴"方法。
尝试使用此命令:
while read -u7 a && read -u8 b; do echo "[$a] [$b]"; done 7<<<"$A" 8<<<"$B"
或
while read -u7 a && read -u8 b; do echo "[$a] [$b]"; done
7< <(echo "$A") 8< <(echo "$B")
在这里read -u7 a
表示从文件描述符7读取到a
变量, 7<<<"$A"
表示将$A
的内容重定向到文件描述符7,7< <(echo "$A")
表示将ECHO输出重定向到文件描述符7。
例如,如果我有A=$(seq 10 15); B=$(seq 20 25);
,则结果是:
[10] [20]
[11] [21]
[12] [22]
[13] [23]
[14] [24]
[15] [25]
将每个字符串的元素加载到数组中,使成对处理变得更加容易。例如:
#!/bin/bash
# ^- must be bash, not sh, for arrays to be a supported feature
IFS=$'n' read -r -d '' -a array_a <<<"$A"
IFS=$'n' read -r -d '' -a array_b <<<"$B"
for idx in "${!array_a[@]}"; do
printf '%st|%sn' "${array_a[$idx]}" "${array_b[$idx]}"
done
我认为您不想使用paste
的原因是您要进一步处理值对。
如果在 shell 代码中进行此操作足够,请考虑TIVN的有用答案或Charles Duffy的有用答案。
如果您确实想使用awk
进行进一步处理,例如在解决方案尝试中,请考虑将 paste
与awk
组合:
#!/usr/bin/env bash
# Sample input
A=$'anbncnd'
B=$'dncnbna'
paste <(echo "$A") <(echo "$B") | awk '{ print "Pair #" NR ": ", $1, $2 }'
-
paste <(echo "$A") <(echo "$B")
合并了两个输入变量的相应线,由t
实例分隔的原点行。 -
awk
的默认字段拆分然后将相应的值作为字段$1
和$2
用于每个输入行。
至于为什么您的awk
命令不起作用:
awk 'BEGIN {OFS=" "}{
getline line < "$A"
print $0,line
} ' "$B"
您的
awk
脚本是单引号,但看起来您正在尝试引用 shell ach$A
ince ince- 由于外壳没有解释单引号的字符串,因此
awk
将解释$A
,这不是意图;
通常,尽管使用单引号的字符串是良好的练习,以避免在壳体提前扩展和awk
看到的东西之间混淆;使用-v varName=varValue
选项将Shell变量值传递给awk
。 -
awk
然后解释$A
_field($
),其中存储在 awk awk actibleA
中的索引 - 由于未定义变量A
,这要么等于$0
,要么等于当前输入线(GNU awk,gnu awk,,gnu awk,awuk awk,a awu awk,a awu awk ,,mawk)或运行时错误(BSD Awk)。 - 即使您确实使用了 shell 变量
"$A"
,getline line <
方法也无法正常工作,因为它需要 fileName ;因此,您必须首先将$A
的内容写入(临时)文件,在awk
脚本中指定该文件的路径代替$A
。 - 您可以看到,这很麻烦,通常
getline
很少是正确的方法 - 请参阅http://awk.info/?tip/getline
- 由于外壳没有解释单引号的字符串,因此
另外,即使它包含 data ,也就是通过
"$B"
,就好像是 fileName toawk
。- 要真正传递数据,您必须使用 stdin ;在
bash
中,这里最简单的方法是使用<<<"$B"
(所谓的此处串线)。
- 要真正传递数据,您必须使用 stdin ;在