【问题标题】:bash print first to nth column in a line iterativelybash 迭代地打印一行中的第一列到第 n 列
【发布时间】:2013-06-21 18:27:05
【问题描述】:

我正在尝试获取文件的列名并迭代地打印它们。我想问题出在print $i,但我不知道如何纠正它。我试过的代码是:

#! /bin/bash
for i in {2..5}
do
  set snp = head -n 1 smaller.txt | awk '{print $i}'
  echo $snp
done

示例输入文件:

ID Name Age Sex State Ext
1  A    12   M    UT  811
2  B    12   F    UT  818

期望的输出:

Name 
Age
Sex 
State
Ext

但我得到的输出是空白屏幕。

【问题讨论】:

  • 不要在循环中设置变量,去掉echo语句。这应该足够了。
  • set 命令是必需的,因为命令的输出是从右侧传递的。我确实尝试在循环外设置变量。我得到错误。

标签: linux bash shell awk


【解决方案1】:

您最好只在文件的第一行 read 并将结果存储为数组:

read -a header < smaller.txt

然后printf相关字段:

printf "%s\n" "${header[@]:1}"

此外,这仅使用,并且不涉及不必要的循环。

编辑。要回答您的评论,您可以循环浏览标题字段:

read -a header < smaller.txt
for snp in "${header[@]:1}"; do
    echo "$snp"
done

编辑 2. 你原来的方法有很多错误。这是它的更正版本(尽管我之前写的是解决问题的更可取的方法):

for i in {2..5}; do
    snp=$(head -n 1 smaller.txt | awk "{print \$$i}")
    echo "$snp"
done
  • set 可能不会像你认为的那样做。
  • 由于awk '{print $i}' 中的单引号,$i 永远不会被 扩展。
  • 此算法不好,因为您调用了 4 次 headawk,而您不需要单个外部进程。

希望这会有所帮助!

【讨论】:

  • 我希望它专门循环,因为我将在脚本中进一步使用这些值进行分析。这就是我希望它循环播放的原因。
  • 谢谢,但这不会打印出任何值。
  • @Vignesh,当然可以! (将再次编辑第一次编辑,以便您拥有完整的命令)。
【解决方案2】:

您可以使用 awk 本身打印它:

awk 'NR==1{for (i=2; i<=5; i++) print $i}' smaller.txt

【讨论】:

    【解决方案3】:

    您的代码的主要问题是您的赋值语法错误。改变这个:

    set snp = head -n 1 smaller.txt | awk '{print $i}'
    

    到这里:

    snp=$(head -n 1 smaller.txt | awk '{print $i}')
    

    即:

    • 不要使用setset 用于设置 shell 选项、编号参数等,而不是用于分配任意变量。
    • 删除= 周围的空格。
    • 要运行命令并将其输出捕获为字符串,请使用$(...)(或`...`,但$(...) 不易出错)。

    也就是说,我同意 gniourf_gniourf 的做法。

    【讨论】:

    • 我尝试了更正,但我收到此错误:找不到命令。做:找不到命令。非法变量名。
    • @Vignesh:显然你没有在 Bash 中运行你的脚本?
    【解决方案4】:

    这是另一种选择;不一定比其他任何人更好或更差:

    for n in $(head smaller.txt)
    do
      echo ${n}
    done
    

    【讨论】:

      【解决方案5】:

      有点像

        for x1 in $(head -n1 smaller.txt );do 
            echo $x1
        done
      

      【讨论】:

        猜你喜欢
        • 2023-02-04
        • 1970-01-01
        • 1970-01-01
        • 2018-04-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-05-05
        相关资源
        最近更新 更多