2013-10-28 3 views
1

У меня есть .txt файл, содержащий координаты точек в формате «x y». Они представляют собой облако точек на плоскости. Моя идея состояла в том, чтобы уменьшить «плотность» облака, уменьшив количество очков на половину. Я использую linux, поэтому для этого я решил удалить половину строк с помощью sed, но только четную или нечетную или в любом случае одну строку на две. Для наглядности я вывешу пример:
Как уменьшить количество строк на половину с помощью sed

Перед

435.225 108.891 
435.212 108.894 <-- to delete 
435.225 108.894 
435.238 108.894 <-- to delete 
435.3 108.894 
435.212 108.897 <-- to delete 
435.238 108.897 
435.288 108.897 <-- to delete 

После

435.225 108.891 
435.225 108.894 
435.3 108.894 
435.238 108.897 

ответ

6

С sed:

$ sed -n 1~2p file 
435.225 108.891 
435.225 108.894 
435.3 108.894 
435.238 108.897 

Он печатает строки, число которых 2K+1, то есть нечетные.

или удаление четные (thanks anishane!):

$ sed 2~2d file 
435.225 108.891 
435.225 108.894 
435.3 108.894 
435.238 108.897 

От man sed:

Адреса ---> первый шаг ~

Match каждый step'th линии, начиная с линии первый. Например, '' sed -n 1 ~ 2p '' будет печатать все строки с нечетными номерами во входном потоке, а адрес 2 ~ 5 будет соответствовать каждой пятой строке, начиная с второй. (Это расширение.)

С awk только это:

$ awk 'NR%2' file 
435.225 108.891 
435.225 108.894 
435.3 108.894 
435.238 108.897 

Как NR обозначает номер строки, NR%2 будет верно только на нечетных, так что они будут те печатные.

+0

+1. Я не знал о примере «sed», о котором вы упоминали. вы могли бы предоставить любую документацию, которая объяснит поведение «1 ~ 2». Благодарю. – slayedbylucifer

+0

Несомненно, @slayedbylucifer, только что обновленный с некоторыми ссылками от 'man sed'. – fedorqui

+0

@slayedbylucifer BTW, '~' является расширением GNU, поэтому команда может не дать ожидаемых результатов на OSX. Вопрос [связанный] (http://stackoverflow.com/questions/2560411/how-to-remove-every-other-line-with-sed) содержит больше вариантов того, как этого достичь. – devnull

0

Попробуйте запустить эту логику в сценарии (.sh файл)

#!/bin/bash 
cnt=0 
while read line 
do 


if [ $cnt -eq 0 ] 
then 
    echo $line >> output.txt 
    cnt=1 
elif [ $cnt -eq 1 ] 
    then 
    cnt=0 
fi 
done < inputfile.txt 
1

Это может работать для вас:

sed 'n;d' file 

для нечетных чисел.

И:

sed '1!n;d' file 

для четно.

Смежные вопросы