Изменение форматирования файлов с помощью фильтров Linux

#bash #shell #awk #pipe

#bash #оболочка #awk #канал

Вопрос:

Я новичок в этом программировании на основе сценариев оболочки, поэтому мне нужна ваша помощь, чтобы написать эффективный код.

Формат входного файла :

 60 00 00 00
00 90 32 20
00 00 00 00
.....
 

Формат выходного файла:

 6000 0000 0090 3220 0000 0000 0000 0000
0000 0000 0000 0001 0000 0000 0000 0000 
......
 

Я хочу преобразовать входной файл в выходной и наоборот, поэтому нужен код для обеих сторон.

Код должен быть в сценарии оболочки Linux с использованием фильтров, таких как awk, sed, grep и т. Д., С использованием операторов перенаправления pipe и linux…

Ограничение

Лучше всего использовать одну строку, в противном случае как можно меньше строк.

Комментарии:

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

2. @TimPost okk .. спасибо за предложение, я бы обязательно запомнил это в будущем…

Ответ №1:

Вот довольно простое решение этой проблемы.

 while read line; do
   block1=`echo $line | awk '{ print $1$2 }'`
   block2=`echo $line | awk '{ print $3$4 }'`
   echo "$block1 $block2 " >> outputfile
done < inputfile
 

Я не уверен, нужно ли вам вставлять новую строку после 8 блоков, но если это так, регулярное выражение, подобное s/(.*){32}/$1n/g , должно сделать свое дело.

Комментарии:

1. да, мне нужен символ новой строки после 8 блоков, и как бы вы посчитали 8 блоков, где я заменю это регулярное выражение. Пожалуйста, внесите правку и для него..

2. к сожалению, я думаю, что это 32 уже для его подсчета, я должен был сначала попробовать. Спасибо n извините за это

Ответ №2:

В bash это может быть очень просто:

 while read a b c d; do printf "%s%s " $a $b $c $d; done < file
 

Если вам нужны новые строки:

 i=0
while read a b c d; do
    printf "%s%s " $a $b $c $d
    if ((   i == 4 )); then 
        echo
        i=0
    fi
done < file
 

Или с помощью awk

 awk '
    {printf("%s%s %s%s ", $1, $2, $3, $4)}
    NR % 4 == 0 {print ""}
' file