как найти последовательность чисел - PullRequest
0 голосов
/ 02 октября 2019

У меня есть файл данных, отформатированный так:

0.00  0.00 0.00
 1   10  1.0
 2   12  1.0
 3   15  1.0
 4   20  0.0
 5   23  0.0
0.20  0.15  0.6
 1   12  1.0
 2   15  1.0
 3   20  0.0
 4   18  0.0
 5   20  0.0
0.001  0.33  0.15
 1   8   1.0
 2   14  1.0
 3   17  0.0
 4   25  0.0
 5   15  0.0

Мне нужно удалить некоторые данные и изменить порядок строк следующим образом:

1  10
1  12
1  8

2  12
2  15
2  14

3  15
3  20
3  17

4  20
4  18
4  25

5  23
5  20
5  15

Мой код ничего не показывает. Проблема может быть в команде grep. Не могли бы вы помочь мне?

touch extract_file.txt
for (( i=1; i<=band; i++))
do
    sed -e '1, 7d' data_file | grep -w " '$(echo $i)' " | awk '{print $2}' > extract(echo $i).txt
    paste -s extract_file.txt extract$(echo $i).txt > data
done
#rm eigen*.txt

Ответы [ 2 ]

0 голосов
/ 02 октября 2019

perl one-liner:

$ perl -lane 'push @{$nums{$F[0]}}, "@F[0,1]" if /^ /;
              END { for $n (sort { $a <=> $b } keys %nums) {
                     print for @{$nums{$n}};
                     print "" }}' input.txt
1 10
1 12
1 8

2 12
2 15
2 14

3 15
3 20
3 17

4 20
4 18
4 25

5 23
5 20
5 15

Обычно для каждой строки, начинающейся с пробела, используйте первое число в качестве ключа к хеш-таблице, в которой хранятся списки первых двух чисел, и распечатывайте ихотсортировано по первому номеру.

0 голосов
/ 02 октября 2019

Следующий код с комментариями:

cat <<EOF |
0.00  0.00 0.00
 1   10  1.0
 2   12  1.0
 3   15  1.0
 4   20  0.0
 5   23  0.0
0.20  0.15  0.6
 1   12  1.0
 2   15  1.0
 3   20  0.0
 4   18  0.0
 5   20  0.0
0.001  0.33  0.15
 1   8   1.0
 2   14  1.0
 3   17  0.0
 4   25  0.0
 5   15  0.0
EOF
# remove lines not starting with a space
grep -v '^[^ ]' |
# remove leading space
sed 's/^[[:space:]]*//' |
# remove third arg
sed 's/[[:space:]]*[^[:space:]]*$//' |
# stable sort on first number
sort -s -n -k1 |
# each time first number changes, print additional newline
awk '{ if(length(last) != 0 && last != $1) printf "\n"; print; last=$1}'

выходы:

1   10
1   12
1   8

2   12
2   15
2   14

3   15
3   20
3   17

4   20
4   18
4   25

5   23
5   20
5   15

Проверено на repl .

...