文件,
TABLE1
-------
1234
TABLE1
-------
9555
TABLE1
-------
87676
TABLE1
-------
2344
我想要的输出像
TABLE1
-------
1234
9555
87676
2344
答案1
这是一个衬垫,使用sed
和awk
:
sed '/^$/d' 文件名 | awk '!a[$1]++'
grep
和的组合awk
:
grep 。文件名 | awk '!a[$1]++'
作为 @CAS建议,您awk
也可以通过单个命令来完成此操作。
awk '!x[$1]++ && ! /^[[:空白:]]*$/' 文件名
答案2
您可以使用awk '!x[$1]++' file > file_new
在尝试此命令时,我在您提供的文件中得到了一个额外的新行。
我将其修改为awk '!x[$1]++' file | sed '/^$/d' > file_new
,这应该可以解决您在这种情况下的问题。
答案3
尽管这是一个旧线程,但我想贡献这个仅使用单个 sed 命令的答案:
sed '1,2p;/^[[:digit:]]/!d;' file
它保留前两行(标题和下划线),然后删除不以数字开头的每一行。
答案4
使用命令uniq
,可以删除重复的条目。喜欢 :
cat file | sort -r | uniq
但在这种特定情况下,不会产生完全预期的结果,因为必须对文件进行排序才能uniq
工作 - 它只会检测相邻的重复行。
另一个解决方案是读取文件并跳过包含TABLE
or 的行----
(第一次出现除外):
count_t=0
count_d=0
while read line; do
if [[ $line == "TABLE"* ]] ; then
if [[ $count_t -eq 0 ]]; then
((count_t++))
else
continue
fi
fi
if [[ $line == "-----"* ]] ; then
if [[ $count_d -eq 0 ]]; then
((count_d++))
else
continue
fi
fi
echo $line
done < file
awk
其他人发布的解决方案sed
虽然更好。