是否可以检查一行是否包含在unix的下一行中,如果是,则删除下一行

时间:2017-08-22 07:32:47

标签: linux bash shell unix

是否可以在一个小文件的while循环中将当前行保存到变量并检查该变量是否包含在下一行中,如果是,则删除下一行;

类似的东西:

while read p ; do
   a gets value of p
   if a included in next line of file, delete next line
done<file

所以,如果我们有这些行:

abc man
abc man 13e1312 22
abc 12345
dec asdasfa sadfasfa
dec 22
dec 2232
dec 22 das fss

会打印出来:

abc man
abc 12345
dec asdasfa sadfasfa
dec 22

3 个答案:

答案 0 :(得分:2)

这是一个使用while loop to read the file line per linestring contains syntax的简单脚本。由于*"$pre"*,它将查看下一行是否包含任何位置之前的行。如果该行不包含该行,则它将打印该行并记住该行之前的行。
使用您需要的文件名更改FILENAME。:

#!/bin/sh
pre=
while IFS='' read -r line || [[ -n "$line" ]]; do
   # echo "Line read from file: $line"
   # if line does not contain line pre
   if ! { [ -n "$pre" ] && [[ "$line" == *"$pre"* ]] ; }; then
      # echo "   <$pre> not found!"
      echo "$line"
      pre=$line
   fi
done < "FILENAME"

<强>输出:

abc man
abc 12345
dec asdasfa sadfasfa
dec 22

答案 1 :(得分:1)

awk '{ dat[NR]=$0 } END { print dat[1];dita=dat[1];for (i=2;i<=NR;i++) { if ( dat[i] !~ dita ) { dita=dat[i];print dita } } }' filename

细分:

{ 
 dat[NR]=$0
}
END { 
      print dat[1]
      dita=dat[1]
      for (i=2;i<=NR;i++) {
                          if ( dat[i] !~ dita ) {
                                                  dita=dat[i]
                                                  print dita
                                                }
                          }
    }

使用awk,将所有数据读入数组,然后打印数组的第一个元素(dat)并将检查变量(dita)设置为第一个元素。然后从第二个元素循环到最后一个元素,检查所有数据对抗dita。如果没有模式匹配,则打印元素并将dita设置为刚刚打印的元素。

答案 2 :(得分:1)

试试这个脚本

#! /bin/bash
unset previousLine
while IFS='' read -r currentLine; do
    if [ -z ${previousLine+x} ] || ! grep -qF "$previousLine" <<< "$currentLine"; then
        echo "$currentLine"
        previousLine="$currentLine"
    fi
done < file
未设置[ -z ${previousLine+x} ]时,

$previousLine为真。 grep检查前一行是否属于当前行。

编辑: Andre Kampling和我都提出了相同的解决方案,但他是第一个回答这个问题的人。