Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.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
Unix 水平合并两个文件并格式化_Unix_Paste - Fatal编程技术网

Unix 水平合并两个文件并格式化

Unix 水平合并两个文件并格式化,unix,paste,Unix,Paste,我有两个文件如下: Austin Texas Los Angeles California York New York San Ramon California 文件1 Austin Los Angeles York San Ramon 文件2 Texas California New York California 我希望按如下方式水平合并它们: Austin Texas Los Angeles California York

我有两个文件如下:

Austin       Texas
Los Angeles  California
York         New York
San Ramon    California
文件1

Austin
Los Angeles
York
San Ramon
文件2

Texas
California
New York
California
我希望按如下方式水平合并它们:

Austin       Texas
Los Angeles  California
York         New York
San Ramon    California
我可以通过使用
paste
命令进行水平合并,但格式正在混乱

Austin Texas
Los Angeles California
York New York
San Ramon California
我意识到
paste
的工作原理是正确的,但是有人能给我指出正确的方向来正确设置格式吗


谢谢。

首先,您必须检查最长行中的字符数。然后,您可以使用fmt将第一个文件中的行填充到更长的长度。使用粘贴完成此操作。

粘贴在“合并”文件时使用一个选项卡,因此您可能需要对文件进行后期处理并删除带有空格的选项卡:

paste File_1 File_2 | awk 'BEGIN { FS = "\t" } ; {printf("%-20s%s\n",$1,$2) }'
结果:

Austin              Texas
Los Angeles         California
York                New York
San Ramon           California

如果您对字段宽度有想法,可以执行以下操作:

IFS_BAK="$IFS"
IFS=$'\t'
paste file_1 file_2 \
| while read city state; do 
    printf "%-15s %-15s\n" "$city" "$state"
  done
IFS="$IFS_BAK"
或者这个较短的版本:

paste file_1 file_2 | while IFS=$'\t' read city state; do
  printf "%-15s %-15s\n" "$city" "$state"
done
或者使用
bsdmainutils
中的
工具:

paste file_1 file_2 | column -s $'\t' -t

首先,我从两个文件中删除了所有选项卡。然后,在第一个文件中,我在所有行的末尾添加了25个空格。我在这个文件上做了一个
粘贴
,效果非常好。例如,使用awk:paste a b | awk'{printf(“%-20s%s\n”,$1,$2)}