2015-04-24 2 views
1

Я пытаюсь принести связку n строк в одну строку, не уверен, как это сделать. Любая помощь приветствуется.транспонировать все n строк в одну строку

Букет из 11 слов, затем пустая строка, а затем снова букет из 11 слов, а затем пустой как ... так далее.

Пример:

cat filename 

hi 
hello 
how 
are 
you 
i 
am 
fine 
how 
are 
you 

hi 
how 
is 
she 
doing 
i 
have 
not 
herd 
from 
her 

.. 
.. 

требуемый выход:

cat newFile 

hi hello how are you i am fine how are you 
hi how is she doing i have not heard from her 
.. 
.. 

ответ

1

Через AWK.

$ awk -v RS= '{gsub(/\n/, " ")}1' file 
hi hello how are you i am fine how are you 
hi how is she doing i have not herd from her 
+0

благодаря этой работал хорошо для меня, мне пришлось использовать «dos2unix -c ASCII» в моем файле один раз, чтобы сделать эту работу. (проблема с моим файлом) –

+0

вы можете попробовать 'awk -v RS = '{gsub (/ [\ r \ n] + /," ")} 1' file' –

0

Вы можете сделать это слишком (немного долго, хотя):

#!/bin/bash 
c=0 
while read -r i 
do 
if [[ $i == "" ]]; then 
line="$line""\n" 
c=2 
elif [[ $c == "2" || $c == "0" ]]; then 
line="$line""$i" 
c=1 
else 
line="$line"" ""$i" 
fi 
done <file1 
echo -e "$line" 

Ouptput:

hi hello how are you i am fine how are you 
hi how is she doing i have not herd from her 
0

Если вам нужно использовать собранные линии в пределах вашего сценария, вы можете хранить каждую строку в массиве при анализе файла для последующего использования:

#!/bin/bash 

declare -i cnt=0 
declare -a array 

while read -r ln; do       # read each line as ln 
    [ "$ln" == "" ] && {      # test for empty ln 
     [ $cnt -gt 0 ] && {      # if not first empty line 
      while [ "${line:0:1}" == ' ' ]; do # trim leading spaces from line 
       line="${line:1}" 
      done 
      array+=("$line")     # add line to array 
      unset line       # unset line 
      continue       # get next line 
     } 
     ((cnt++))        # increment count 
    } 
    line+=" $ln"        # append ln to line 
done <"$1" 
[ ${#line} -gt 0 ] && array+=("$line")  # if no trailing blank line 

for ((a = 0; a < ${#array[@]}; a++)); do  # output array 
    printf " array[%d]: %s\n" "$a" "${array[a]}" 
done 

exit 0 

Входной

$ cat dat/bunchw.txt 

hi 
hello 
how 
are 
you 
i 
am 
fine 
how 
are 
you 

hi 
how 
is 
she 
doing 
i 
have 
not 
herd 
from 
her 

Выход

$ bash rdwordsline.sh dat/bunchw.txt 
array[0]: hi hello how are you i am fine how are you 
array[1]: hi how is she doing i have not herd from her 
2

Обработка блоков текста, разделенных пустыми строками, как одна запись называется режимом пункта в AWK:

$ awk -v RS= '{$1=$1}1' file 
hi hello how are you i am fine how are you 
hi how is she doing i have not herd from her 
Смежные вопросы