我正在尝试获取文件的列名并反复打印它们。我想问题是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
但我得到的输出是空白屏幕。
答案 0 :(得分:4)
你最好只是read
文件的第一行并将结果存储为数组:
read -a header < smaller.txt
然后printf
相关字段:
printf "%s\n" "${header[@]:1}"
此外,它仅使用bash,并且不涉及不必要的循环。
编辑。要回答您的评论,您还可以遍历标题字段:
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
永远不会被bash扩展。head
和awk
4次,而您不需要单个外部流程。希望这有帮助!
答案 1 :(得分:1)
您可以使用awk本身打印它:
awk 'NR==1{for (i=2; i<=5; i++) print $i}' smaller.txt
答案 2 :(得分:0)
您的代码的主要问题是您的赋值语法错误。改变这个:
set snp = head -n 1 smaller.txt | awk '{print $i}'
到此:
snp=$(head -n 1 smaller.txt | awk '{print $i}')
那是:
set
。 set
用于设置shell选项,编号参数等,而不是用于分配任意变量。=
周围的空格。$(...)
(或`...`
,但$(...)
不太容易出错。那就是说,我同意gniourf_gniourf的方法。
答案 3 :(得分:0)
这是另一种选择;不一定比其他任何一个更好或更差:
for n in $(head smaller.txt)
do
echo ${n}
done
答案 4 :(得分:0)
for x1 in $(head -n1 smaller.txt );do
echo $x1
done