0

我有 2 个带有以下文本的文件:

旧文件:

Filesystem            Size  Used Avail Use% Mounted on
/dev/mapper/vg_livecd-lv_root
                       18G  2.4G   15G  14% /
tmpfs                 590M  276K  590M   1% /dev/shm
/dev/sda1             485M   31M  429M   7% /boot

新文件

Filesystem            Size  Used Avail Use% Mounted on
/dev/mapper/vg_livecd-lv_root
                       18G  2.7G   15G  14% /
tmpfs                 590M  264K  590M   1% /dev/shm
/dev/sda1             485M   31M  429M   7% /boot
/dev/sdb1             3.8G  1.1G  2.8G  28% /media/9C6F-1ECD

现在在输出文件中我只想要以下行。因为这是新添加的。

/dev/sdb1             3.8G  1.1G  2.8G  28% /media/9C6F-1ECD

但相反,我得到了以下输出,因为一个数字也从 2.4 更改为 2.7。

                        18G  2.7G   15G  14% /
/dev/sdb1             3.8G  1.1G  2.8G  28% /media/9C6F-1ECD

所以这给我带来了问题。我只想要全新添加的行。

4

3 回答 3

0

这可能会让你接近你想要的,

diff -y --suppress-common-lines oldfile newfile

主要问题是它还包括您要排除的小更改。如果可以安全地假设更改很小的行将不包含“|” 用空格包围,然后我们可以删除相应的差异输出,只留下那些添加或删除的行。

diff -y --suppress-common-lines oldfile newfile | sed '/[ TAB][ TAB]*|[ TAB][ TAB]*/ d'

其中“TAB”应该是制表符。

这将显示添加和删除的行,但有一个重要限制:如果添加和删除的行相邻,则 diff 将报告更改的行(带有“|”),并且此输出将被 sed 过滤器丢弃。

如果您需要添加/删除的行在文件中显示,您可以使用附加的 sed 命令从差异输出中删除 < 和 >。例如,要去掉表示添加行的 >:

diff -y --suppress-common-lines oldfile newfile | sed -e '/[ TAB][ TAB]*|[ TAB][ TAB]*/ d' -e 's/^[ TAB][ TAB]*>[ TAB][ TAB]*\(.*$\)/\1/'

但请注意,这也会从行中删除任何前导空格。

于 2012-04-17T15:48:29.550 回答
0

仅查找没有相似性的行

diff -y --suppress-common-lines /yourfile1 /yourfile2 | grep "<" | sed 's/  .*//g'
于 2012-04-17T16:51:52.190 回答
0

首先,将您想要比较的部分放在最后,如下所示:

df -P | awk 'NR > 1 {print $1 ":" $6 "\t" $0 }' | sort >comm-test.1
df -P | awk 'NR > 1 {print $1 ":" $6 "\t" $0 }' | sort >comm-test.2

然后:

join -t $'\t' -j 1 -o 2.2 \
  <(comm -13 \
     <(cut -f1 comm-test.1) \
     <(cut -f1 comm-test.2)) \
  comm-test.2

请注意df -P用于确保 df 的输出不会拆分为多行(如您的示例中所示)。

顺便说一句——掩盖你的问题是非常无益的。今后请不要这样做。

于 2012-04-17T22:10:31.393 回答