Macos Unix帮助将第2行和第3行移动到第1行的中间
我试图将每2行和第3行连接到第1行的中间;在第1行最后一个制表符之前 这是一个可怕的银行系统输出的数据样本。每一行都以MM/DD格式的日期开头,后跟制表符,以美元金额结尾,后跟制表符Macos Unix帮助将第2行和第3行移动到第1行的中间,macos,perl,unix,awk,sed,Macos,Perl,Unix,Awk,Sed,我试图将每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 0553
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
希望这是有道理的。我在这里浏览了大量的帖子,虽然它们都很有用,但大多数都是关于将两行合并在一起,或者将它们打印到一个文件中,等等,而不是将行粘贴到另一行的中间。提前感谢您的帮助 请您尝试以下内容(建议在您的帖子中添加您的努力,请在您的帖子中添加) 输出如下
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
给定示例数据和结果,
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):
严格来说,一轮三行
如果您的系统上有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'
使用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
$
或
或
这可能适用于您(GNU-sed):
将下两行添加到当前行,并使用模式匹配将字符串组组合成所需格式。最好先显示您尝试过的内容和结果。欢迎访问SO@Stanley,建议您在帖子中添加3个简单内容。1-输入样本,2-输出样本,3-您在代码标签
{}
符号中的尝试。我们要求人们在他们的问题中加入努力,因为我们都在这里学习。
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'
$ 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
$
sed -E 'N;N;s/^(.*\S)(\s+\S+)\n(.*)\n(.*)/\1 \3 \4\2/' file