我正在寻找一种在shell上逐行打印的方法。
例如,我有以下变量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是* \ n b \ n c \ n d \ n *
请不要'列'或'粘贴'方法。
答案 0 :(得分:1)
尝试使用此命令:
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]
答案 1 :(得分:1)
我认为你不想使用paste
的原因是你想进一步处理价值对。
如果在 shell 代码中执行此处理就足够了,请考虑tivn's helpful answer或Charles Duffy's helpful answer。
如果您确实希望使用awk
进行进一步处理,请参阅解决方案尝试,请考虑将 paste
与awk
合并:
#!/usr/bin/env bash
# Sample input
A=$'a\nb\nc\nd'
B=$'d\nc\nb\na'
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 变量$A
awk
将解释$A
,这不是意图; awk
看到的内容之间产生混淆;使用-v varName=varValue
选项将shell变量值传递给awk
。awk
然后使用 awk 变量$A
中存储的索引解释$
_field(A
) - 因为变量{{1} }未定义,它等效于A
,当前输入行(GNU awk,mawk)或运行时错误(BSD awk)。$0
,"$A"
方法也行不通,因为它需要文件名;因此,您必须先将getline line <
的内容写入(临时)文件,然后在$A
中指定该文件的路径以代替$A
} script。awk
很少是正确的做法 - 请参阅http://awk.info/?tip/getline 此外,您传递getline
,即使它包含数据,就好像它是{em>文件名到"$B"
awk
中,最简单的方法是使用bash
(所谓的here-string)。答案 2 :(得分:1)
将每个字符串的元素加载到数组中会使成对处理更容易。例如:
#!/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 '%s\t|%s\n' "${array_a[$idx]}" "${array_b[$idx]}"
done