Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/amazon-s3/2.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
Bash 从另一个文件添加列_Bash_Perl_Awk_Insert - Fatal编程技术网

Bash 从另一个文件添加列

Bash 从另一个文件添加列,bash,perl,awk,insert,Bash,Perl,Awk,Insert,我有以下问题: 有一个以制表符分隔的文件: Code1 Number1 Name1 Phone1 Code2 Number2 Name2 Phone2 Code3 Number3 Name3 Phone3 Code4 Number4 Name4 Phone4 我有一个文件: Surname 1 Surname 2 Surname 3 Surname 4 我期望的输出是: Code1 Number1 Name1 Surname1 Phone1 Code1 Numb

我有以下问题:

有一个以制表符分隔的文件:

Code1  Number1  Name1  Phone1
Code2  Number2  Name2  Phone2
Code3  Number3  Name3  Phone3
Code4  Number4  Name4  Phone4
我有一个文件:

Surname 1
Surname 2
Surname 3
Surname 4
我期望的输出是:

Code1  Number1  Name1 Surname1 Phone1
Code1  Number1  Name1 Surname2 Phone1
Code1  Number1  Name1 Surname3 Phone1
Code1  Number1  Name1 Surname4 Phone1
我知道我可能必须为此使用awk,但我只知道如何在其他列之间插入一个固定值的列,使用:

awk '{ $2=$2"newvalue" print $0 }'
但我不知道如何从另一个文件中读取行,并将它们存储在newvalue中,以获得上述所需的输出。我不需要awk的具体建议。感谢您的帮助。

使用粘贴和awk

user@host:/tmp$ paste file1 file2 | awk '{print $1, $2, $3, $5$6, $4}' | column -t
Code1  Number1  Name1  Surname1  Phone1
Code1  Number1  Name1  Surname2  Phone1
Code1  Number1  Name1  Surname3  Phone1
Code1  Number1  Name1  Surname4  Phone1
粘贴用于连接文件

column-t用于设置格式

仅限AWK:

$ awk 'NR==FNR{a[FNR]=$1$2;next} {print $1,$2,$3,a[FNR],$4}' file2 file1
Code1 Number1 Name1 Surname1 Phone1
Code2 Number2 Name2 Surname2 Phone2
Code3 Number3 Name3 Surname3 Phone3
Code4 Number4 Name4 Surname4 Phone4
使用paste和vim

然后在vim中打开newfile.txt

然后做一个regex取代基,如下所示

:%s/\(.*\)\t\(.*\)\t\(.*\)\t\(.*\)\t\(.*\)/\1\t\2\t\3\t\5\6\t\4
只需剪切并粘贴:


输出分隔符是制表符。姓氏后的空格可以通过管道连接到tr-d\。

如何匹配文件中的记录或行?更新了问题,两个文件被排序,只需要混合,第二个文件的第一行在第一个文件的第一行,在名称1之后。
:%s/\(.*\)\t\(.*\)\t\(.*\)\t\(.*\)\t\(.*\)/\1\t\2\t\3\t\5\6\t\4
$ paste <(cut -f 1-3 a) b <(cut -f 4 a)
Code1   Number1 Name1   Surname 1       Phone1
Code2   Number2 Name2   Surname 2       Phone2
Code3   Number3 Name3   Surname 3       Phone3
Code4   Number4 Name4   Surname 4       Phone4