【问题标题】:Use row 1 column ith as output filename awk使用第 1 行第 i 列作为输出文件名 awk
【发布时间】:2019-04-16 05:13:58
【问题描述】:

我是最近的命令行用户,因此我需要一些帮助才能使用 awk 按列拆分文本文件。对我来说困难在于我希望第 i 个文件名是第 i 列第一行的文本。

这就是我的想法:

awk '{for(i = 2; i <= NF; i++){name= ??FNR == 1 $i?? ;print $1, $i > name}}' myfile.txt

但我不知道如何设置名称变量...

输入:myfile.txt

'ID'    'sample_1' 'sample_2' ...
'id_1'      1            2    ...
'id_2'      2            3    ...

预期输出:

sample_1.txt:

'ID'    'sample_1'
'id_1'      1      
'id_2'      2  

sample_2.txt:

'ID'    'sample_2'
'id_1'      2      
'id_2'      3 

谢谢

【问题讨论】:

  • 欢迎来到 SO,感谢您展示了您的尝试。请在您的帖子中添加输入和预期输出示例,然后让我们知道。
  • 确实,在这种情况下,第 i 个文件名是什么? awk 一次读取一个文件,它的名称在FILENAME 变量中,但这似乎不是您要问的。
  • 抱歉,我用输入/输出示例编辑了我的帖子

标签: awk command-line


【解决方案1】:

你可以试试这个 awk :

awk -F'\t' '                              # tab as field separator
{
  for ( i = 2 ; i <= NF ; i++ ) {         # for each record loop from field 2 to last field
    if ( NR == 1 ) {                      # if first record
      a[i] = $i                           # keep each field in array a
      gsub ( /^'\''|'\''$/ , "" , a[i] )  # remove quote at start and end in array a
      }
    print $1 FS $i > a[i]".txt"           # print needed field in corresponding file
  }
}' myfile.txt

【讨论】:

    【解决方案2】:

    您应该将列标题保存在一个数组中。

    awk 'NR==1 {
        for (i=2; i<=NF; ++i) {
            fnames[i] = gensub(/\x27/, "", "g", $i) 
            print $1, $i > fnames[i] ".txt"
        }
        next
    }
    {
        for (i=2; i<=NF; ++i)
            print $1, "\x27" $i "\x27" > fnames[i] ".txt"
    }' myfile.txt
    
    • \x27 是十六进制转义形式的单引号
    • gensub(/\x27/, "", "g", $i) 删除列标题中的单引号以根据需要命名输出文件。

    【讨论】:

      猜你喜欢
      • 2013-03-28
      • 2017-04-23
      • 1970-01-01
      • 2013-12-06
      • 1970-01-01
      • 2018-05-15
      • 1970-01-01
      • 2016-10-20
      • 2012-11-08
      相关资源
      最近更新 更多