Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Macos Unix帮助将第2行和第3行移动到第1行的中间_Macos_Perl_Unix_Awk_Sed - Fatal编程技术网

Macos Unix帮助将第2行和第3行移动到第1行的中间

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

我试图将每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

希望这是有道理的。我在这里浏览了大量的帖子,虽然它们都很有用,但大多数都是关于将两行合并在一起,或者将它们打印到一个文件中,等等,而不是将行粘贴到另一行的中间。提前感谢您的帮助

请您尝试以下内容(建议在您的帖子中添加您的努力,请在您的帖子中添加)

输出如下

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