将diff命令的输出记录到linux中的单独文件中

时间:2014-02-26 05:56:41

标签: bash unix csv diff hp-ux

我在2个不同的目录中有2个csv文件,我正在运行这样的差异:

diff -b -r -w <dir-one>/AFB.csv <dir-two>/AFB.csv

我按预期获得输出:

14c14
< image_collapse,,collapse,,,,,batchcriteria^M
---
> image_collapse1,,collapse1,,,,,batchcriteria^M
16a17
> image_refresh,,refresh,,,,,batchcriteria^M

我的要求是已更改的行应该转到changed.log文件,已经附加的行应该转到append.log。

输出清楚地显示14c14中的“c”表示该行已更改,而16a17中的“a”表示已附加行。但是我如何将它们记录在不同的日志文件中。

2 个答案:

答案 0 :(得分:1)

编辑:与下面的原始答案相同,但避免了HP-UX上diff不支持的选项。使用类似的东西:

diff -b -r -w /tmp/one.txt /tmp/two.txt \
| sed -n -e '/c/ {s/[^c]*c\(.*\)/\1 p/;p}' \
| sed -n -f - /tmp/two.txt > /tmp/changed.txt

diff -b -r -w /tmp/one.txt /tmp/two.txt \
| sed -n -e '/a/ {s/[^a]*a\(.*\)/\1 p/;p}' \
| sed -n -f - /tmp/two.txt > /tmp/new.txt

这会将diff输出的行号转换为sed打印(p)命令,以添加(a)和更改(c)行范围。生成的sed脚本将应用于第二个文件,以仅打印所需的行。 (我希望HP-UX sed支持-f -从标准输入中获取脚本。)


似乎有一种解决方案不需要解释diff输出中的行号。 diff支持--side-by-side格式化(-y),其中包含使用<>|标记旧行,新行和更改行的装订线分别。您可以使用--width=1(或-W1)将此并排格式简化为标记。如果您使用更改的和新的标记(grep -v)并在其前面添加第二个文件的行(paste),则可以通过前缀标记过滤(grep)并扔掉( cut)标记。您可以为新文件和已更改文件执行此操作。

这是一个独立的“脚本​​”作为例子:

# create two example files (one character per line)
echo abcdefghijklmnopqrstuvwxyz | grep -o . > /tmp/one.txt
echo abcDeFghiJKlmnopPqrsStuvVVwxyzZZZ | grep -o . > /tmp/two.txt

# diff side-by-side to get markers and apply to new file

diff -b -r -w -y -W1  /tmp/one.txt /tmp/two.txt \
| fgrep -v '<' | paste - /tmp/two.txt \
| grep -e '^|' | cut -c3- > /tmp/changed.txt

diff -b -r -w -y -W1  /tmp/one.txt /tmp/two.txt \
| fgrep -v '<' | paste - /tmp/two.txt \
| grep -e '^>' | cut -c3- > /tmp/new.txt

# dump result
cat /tmp/changed.txt
echo ---
cat /tmp/new.txt

它的输出是

D
F
J
K
---
P
S
V
V
Z
Z
Z

我希望这可以帮助您解决问题。

答案 1 :(得分:1)

这可以通过“grep”命令完成,如下所示。

diff -b -r -w <dir-one>/AFB.csv <dir-two>/AFB.csv | grep ">" >> append.log
diff -b -r -w <dir-one>/AFB.csv <dir-two>/AFB.csv | grep "<" >> changed.log