Unix поможет переместить строки 2 и 3 в середину строки 1 - PullRequest
0 голосов
/ 29 января 2019

Я пытаюсь объединить каждую 2-ю и 3-ю строки в середину строки 1;перед последним символом табуляции в строке 1 конкретно.

Вот пример данных, которые я имею, которые были выведены ужасной банковской системой.Каждая первая строка начинается с даты в формате MM / DD, за которой следует символ табуляции, и заканчивается суммой в долларах, которой предшествует символ табуляции.

05/04   DEBIT CARD PURCHASE, AUT 055329 VISA DDA PUR    30.64
ESTABLISHMENT 941 00009415 MAYS LNDG * MN
4885434317495585
05/07   DEBIT CARD PURCHASE, AUT 055329 VISA DDA PUR    181.24
ESTABLISHMENT 555 5551212 * TX
4885434317495585
05/07   DEBIT CARD PURCHASE, AUT 050418 VISA DDA PUR    42.50
ESTABLISHMENT * IL
4885434317495585

Как видите, я пытаюсь объединить строки 2 и 3 и поместить их перед последним символом табуляции в строке 1. Итак, в основном,

05/04   DEBIT CARD PURCHASE, AUT 055329 VISA DDA PUR  ESTABLISHMENT 941 00009415 MAYS LNDG * MN 4885434317495585    30.64
05/07   DEBIT CARD PURCHASE, AUT 055329 VISA DDA PUR ESTABLISHMENT 555 5551212 * TX 4885434317495585    181.24 
05/07   DEBIT CARD PURCHASE, AUT 050418 VISA DDA PUR ESTABLISHMENT * IL 4885434317495585    42.50

Надеюсь, этоимело смысл.Я просмотрел здесь тонну постов, и, хотя все они были полезны, большинство из них касалось слияния двух строк или их печати в файл и т. Д., Но не вставляли строки в середину другой строки.Заранее благодарю за любую помощь.

Ответы [ 4 ]

0 голосов
/ 29 января 2019

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

sed -E 'N;N;s/^(.*\S)(\s+\S+)\n(.*)\n(.*)/\1 \3 \4\2/' file

Добавьте следующие две строки к текущей строке и с помощью сопоставления с образцом объедините группы строк в требуемый формат.

0 голосов
/ 29 января 2019

Учитывая ваши данные выборки и результат, способ harcode может быть:

awk -F"\t" 'FNR%3==1{left=$1 "\t" $2; right=$3}FNR%3!=1{left=left " " $1}FNR%3==0{print left "\t" right;}'

Другой способ (GNU awk):

awk 'BEGIN{FS=OFS="\t"}FNR%3==1{tvar=$NF;NF--;printf $0 " "}FNR%3==2{printf $0 " "}FNR%3==0{print $0,tvar}'

Это также строго 3 строки в раунде.

Если в вашей системе ruby:

ruby -aF"\t" -ne 'case $.%3;when 1; tvar=$F[-1];gsub(/\t[^\t]*$/," ");print $_; when 2; print $_.chomp + " ";else; puts $_.chomp + "\t" + tvar;end'
0 голосов
/ 29 января 2019

Используя Perl,

$ cat stanley.txt
05/04   DEBIT CARD PURCHASE, AUT 055329 VISA DDA PUR    30.64
ESTABLISHMENT 941 00009415 MAYS LNDG * MN
4885434317495585
05/07   DEBIT CARD PURCHASE, AUT 055329 VISA DDA PUR    181.24
ESTABLISHMENT 555 5551212 * TX
4885434317495585
05/07   DEBIT CARD PURCHASE, AUT 050418 VISA DDA PUR    42.50
ESTABLISHMENT * IL
4885434317495585

$ perl -0777 -ne ' while( /^(\d+.+?)\n(.+?)\n(.+?)\n/msg ) { $x=$1;$a=$2;$c=$3;$y=$x;$y=~s/.*\s([\d\.]+)$/\1/g; $x=~s/$y$//g; print "$x $a $c $y\n" } ' stanley.txt
05/04   DEBIT CARD PURCHASE, AUT 055329 VISA DDA PUR     ESTABLISHMENT 941 00009415 MAYS LNDG * MN 4885434317495585 30.64
05/07   DEBIT CARD PURCHASE, AUT 055329 VISA DDA PUR     ESTABLISHMENT 555 5551212 * TX 4885434317495585 181.24
05/07   DEBIT CARD PURCHASE, AUT 050418 VISA DDA PUR     ESTABLISHMENT * IL 4885434317495585 42.50

$

или

$ perl -0777 -ne ' while( /^(\d+.+?)\n(.+?)\n(.+?)\n/msg ) { $x=$1;$a="$2 $3";$y=$x;$y=~s/.*\s+([\d\.]+)$/\1/g; $x=~s/$y$//g; print "$x $a $y\n" } ' stanley.txt
05/04   DEBIT CARD PURCHASE, AUT 055329 VISA DDA PUR     ESTABLISHMENT 941 00009415 MAYS LNDG * MN 4885434317495585 30.64
05/07   DEBIT CARD PURCHASE, AUT 055329 VISA DDA PUR     ESTABLISHMENT 555 5551212 * TX 4885434317495585 181.24
05/07   DEBIT CARD PURCHASE, AUT 050418 VISA DDA PUR     ESTABLISHMENT * IL 4885434317495585 42.50

$

или

$ perl -0777 -ne ' while( /^(\d+.+?)\n(.+?)\n(.+?)\n/msg ) { $x=$1;$a="$2 $3";@z=$x=~/\s+(\S+)$/g; $x=~s/$z[0]$//g; print "$x $a $z[0]\n" } ' stanley.txt
05/04   DEBIT CARD PURCHASE, AUT 055329 VISA DDA PUR     ESTABLISHMENT 941 00009415 MAYS LNDG * MN 4885434317495585 30.64
05/07   DEBIT CARD PURCHASE, AUT 055329 VISA DDA PUR     ESTABLISHMENT 555 5551212 * TX 4885434317495585 181.24
05/07   DEBIT CARD PURCHASE, AUT 050418 VISA DDA PUR     ESTABLISHMENT * IL 4885434317495585 42.50

$
0 голосов
/ 29 января 2019

Не могли бы вы попробовать следующее (Поскольку желательно добавить ваши усилия в вашем сообщении, так что, пожалуйста, сделайте это в своем сообщении).

awk '
/^[0-9]+\/[0-9]+/{
  if(value){
     print value,val
     value=val=""
  }
  found=1
  val=$NF
  sub(/.*/,"",$NF)
  value=$0
  next
}
  found{
      value=(value?value OFS:"")$0
  }
/^[0-9]*$/{
  found=""
}
END{
  if(value){
      print value,val
  }
}'  Input_file

Вывод будет следующим.

05/04 DEBIT CARD PURCHASE, AUT 055329 VISA DDA PUR  ESTABLISHMENT 941 00009415 MAYS LNDG * MN 4885434317495585 30.64
05/07 DEBIT CARD PURCHASE, AUT 055329 VISA DDA PUR  ESTABLISHMENT 555 5551212 * TX 4885434317495585 181.24
05/07 DEBIT CARD PURCHASE, AUT 050418 VISA DDA PUR  ESTABLISHMENT * IL 4885434317495585 42.50
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...