4

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

1 2 3 4
1 3 5 4 8
3 2 1 

Каждая строка имеет разное количество цифр. И есть еще 1000, как это.

Я хочу вывод, как это:

1 2
2 3
3 4
4 0
1 3
3 5
5 4
4 8
8 0
3 2
2 1
1 0

редактирование сделано в этот пост!

Я имею в виду, если это последняя цифра в строке, поставьте эту цифру и затем ноль помимо нее

например, если цифра является последней в этой строке, мы помещаем в выходную новую строку эту цифру и ноль

4 0 and others:see output sample tnx

в приведенном выше примере и

Как я могу это сделать, в perl awk или bash

Я использую это, но это не работает ((

awk '{
for (i=1; i<NF; i++)
{
if ( $(i+1) == "")
print $i, "0"
else
print $i, $(i+1)
}
}' UniqASinline> inTestAst

выходной файл мистера глинна джекмана:

для этого импульса:

3549 
3549 10026 
3549 10026 10010 
3549 10026  
awk '{for (i=1; i<=NF; i++) printf("%d %d\n", $i, $(i+1))}' filename

3549 
3549 10026
10026 
3549 10026
10026 10010
10010 
3549 10026
10026

но мы ожидаем:

3549 0
3549 10026
10026 0
3549 10026
10026 10010
10010 0
3549 10026
10026 0

Тпх

3 ответа3

3

Попробуйте сделать это в

 perl -lane '$c=0; for (@F){ print "$F[$c]\t$F[$c+=1]" if $F[$c+1]}' file.txt

Или разлагается:

perl -lane '
    $c=0;
    for (@F) {
        print "$F[$c]\t$F[$c+=1]"
            if $F[$c+1];
    }
' file.txt

ПОЯСНЕНИЯ

  • переключатели lane означают: l = переводы строки; a = авторазделение в массиве @F; n = like while (<>) магический алмазный оператор; e = основной переключатель для запуска команды
  • $c=0 назначить 0 счетчику
  • for (@F) { для каждого элемента текущей строки
  • print "$F[$c]\t$F[$c+=1]" : распечатать элемент массива с индексом $ c + tab + $ c + 1
  • if $F[$c+1]; : применить последнюю строку, только если $ F [$ c + 1] не равно нулю

Или используя (тот же алгоритм), возможно, более понятный для начинающих:

while read a; do
    arr=( $a )
    for ((i=0; i< ${#arr[@]}; i++)); do
        [[ ${arr[i+1]} ]] && echo "${arr[i]} ${arr[i+1]}"
    done
done < file.txt
3

Вот чистое решение Bash:

while read -a a; do
    for ((i=0;i<${#a[@]}-1;++i)); do
        echo "${a[@]:i:2}"
    done
done < file.txt
3
awk '{for (i=1; i<NF; i++) print $i, $(i+1)}' filename

РЕДАКТИРОВАТЬ: чтобы отразить ваше новое требование

awk '{for (i=1; i<=NF; i++) printf("%d %d\n", $i, $(i+1))}' filename
# ----------------^ 

Это использует тот факт, что awk обрабатывает неинициализированные значения (здесь $(NF+1)) как пустую строку (в строковом контексте) или ноль (в числовом контексте).

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .