使用带有awk的paste命令

时间:2017-04-27 18:55:37

标签: variables awk paste tcsh

我的脚本的目的是将每个文本文件的第二列放在一个目录中,然后逐列将结果粘贴到一个文本文件中。

例如,如果我有三个格式为

的文本文件
 age 30

 gender m

 weight 200

我希望输出为

 age 30 40 50

 gender m m f.

 weight 200 194 143

这是我目前的代码:

 !/bin/csh
 set z = "e"

 foreach y (*.txt)


 if ($z == "e") then

 echo "creating first columns for $y"

 awk '{print $1}' $y  > $SUBJECTS_DIR/vol_files/$y:r_rhvol.txt

 else

 echo "first columns have already been created for $y"

 endif


 echo "now adding the data for $y"

 set v = (awk '{print $2}' $y) 

 paste $v >> $SUBJECTS_DIR/vol_files/$y:r_rhvol.txt

 set z = "f"
 end

谢谢!

2 个答案:

答案 0 :(得分:2)

这是一个让我在玩耍的时候娱乐的人:

$ join foo <(join foo foo )
age 30 30 30

gender m m m

weight 200 200 200

这是awk中的一个:

$ awk '{a[$1]=a[$1] (a[$1]==""?"":OFS) $2}END{for(i in a)print i, a[i]}' foo foo foo

age 30 30 30
weight 200 200 200
gender m m m

说明:

$ awk '
{ a[$1]=a[$1] (a[$1]==""?"":OFS) $2 }  # hash on the first field and append append
END { for(i in a)                      # after all files hashed
          print i, a[i] }              # print (in random order, though)
' foo foo foo

答案 1 :(得分:1)

针对具有已知结构的多个文件的 粘贴 + awk 管道的简短解决方案。

我们说我们有5个文件(可能更多):

paste $SUBJECTS_DIR/vol_files/*.txt | awk '{for(i=3;i<=NF;i+=2) $i=""}1'

示例性输出:

age 30  40  50  60  70
gender m  m  f.  e  g
weight 200  194  143  300  400

awk '{for(i=3;i<=NF;i+=2) $i=""}1' - 从联接的行中删除重复的标题列age , gender ...