Bash 从两个不同的文本文件中减去行值

Bash 从两个不同的文本文件中减去行值,bash,Bash,我有两个文本文件,每个文件有一列和几行: 文件1 a b c 文件2 d e f 我想创建一个具有以下输出的文件: a-d b-e c-f 所有条目都是数字(小数)。我完全陷入困境,不知道如何继续 使用paste似乎是显而易见的选择,但遗憾的是,您不能指定多字符分隔符。要解决这个问题,您可以通过管道将输出传输到sed: $ paste -d- file1 file2 | sed 's/-/ - /' a - d b - e c - f “粘贴”将两个文件连接在一起,并在-周围添加空格 如果所需

我有两个文本文件,每个文件有一列和几行:
文件1
a
b
c

文件2
d
e
f

我想创建一个具有以下输出的文件:
a-d
b-e
c-f


所有条目都是数字(小数)。我完全陷入困境,不知道如何继续

使用
paste
似乎是显而易见的选择,但遗憾的是,您不能指定多字符分隔符。要解决这个问题,您可以通过管道将输出传输到
sed

$ paste -d- file1 file2 | sed 's/-/ - /'
a - d
b - e
c - f
“粘贴”将两个文件连接在一起,并在
-
周围添加空格

如果所需的输出是减法的结果,则可以使用awk:

paste file1 file2 | awk '{ print $1 - $2 }'

使用
paste
似乎是显而易见的选择,但遗憾的是,您不能指定多字符分隔符。要解决这个问题,您可以通过管道将输出传输到
sed

$ paste -d- file1 file2 | sed 's/-/ - /'
a - d
b - e
c - f
“粘贴”将两个文件连接在一起,并在
-
周围添加空格

如果所需的输出是减法的结果,则可以使用awk:

paste file1 file2 | awk '{ print $1 - $2 }'
鉴于:

awk很适合处理这两个文件并进行算术运算:

$ awk 'FNR==NR { a[FNR""] = $0; next } { print a[FN""]+$1 }' /tmp/a.txt /tmp/b.txt
5
7
9
$ awk 'FNR==NR { a[FNR""] = $0; next } { print a[FNR""] " - "$0 }' /tmp/a.txt /tmp/b.txt
1 - 4
2 - 5
3 - 6
或者,如果需要字符串而不是算术:

$ awk 'FNR==NR { a[FNR""] = $0; next } { print a[FN""]+$1 }' /tmp/a.txt /tmp/b.txt
5
7
9
$ awk 'FNR==NR { a[FNR""] = $0; next } { print a[FNR""] " - "$0 }' /tmp/a.txt /tmp/b.txt
1 - 4
2 - 5
3 - 6
鉴于:

awk很适合处理这两个文件并进行算术运算:

$ awk 'FNR==NR { a[FNR""] = $0; next } { print a[FN""]+$1 }' /tmp/a.txt /tmp/b.txt
5
7
9
$ awk 'FNR==NR { a[FNR""] = $0; next } { print a[FNR""] " - "$0 }' /tmp/a.txt /tmp/b.txt
1 - 4
2 - 5
3 - 6
或者,如果需要字符串而不是算术:

$ awk 'FNR==NR { a[FNR""] = $0; next } { print a[FN""]+$1 }' /tmp/a.txt /tmp/b.txt
5
7
9
$ awk 'FNR==NR { a[FNR""] = $0; next } { print a[FNR""] " - "$0 }' /tmp/a.txt /tmp/b.txt
1 - 4
2 - 5
3 - 6

另一个使用while和文件描述符的解决方案:

while read -r line1 <&3  && read -r line2 <&4 
do 
#printf '%s - %s\n' "$line1" "$line2"
printf '%s\n' $(($line1 - $line2))
done 3<f1.txt 4<f2.txt

while read-r line1另一种使用while和文件描述符的解决方案:

while read -r line1 <&3  && read -r line2 <&4 
do 
#printf '%s - %s\n' "$line1" "$line2"
printf '%s\n' $(($line1 - $line2))
done 3<f1.txt 4<f2.txt

当read-r line1时,你想要实际的算术还是字符串?你想要实际的算术还是字符串?基于标题,我认为OP想要
a-d
等的值,而不仅仅是表达式。(这可以通过管道将输出传输到
xargs-n3 expr
)。@chepner是的,看起来你可能就在那里。很好地使用了
xargs
!基于标题,我认为OP想要的是
a-d
等的值,而不仅仅是表达式(你可以通过管道将输出传输到
xargs-n3 expr
)。@chepner是的,看起来你可能就在那里。很好地使用了
xargs
!我认为OP需要实际的减法(简单到
printf'%s\n'$($line1-$line2))
)。我认为OP需要实际的减法(简单到
printf'%s\n'$($line1-$line2))
)。