是否可以在一个小文件的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
答案 0 :(得分:2)
这是一个使用while loop to read the file line per line和string 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和我都提出了相同的解决方案,但他是第一个回答这个问题的人。