我在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”表示已附加行。但是我如何将它们记录在不同的日志文件中。
答案 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