[英]Print sum of Nth column at the header of file with existing rows bash
[英]bash print first to nth column in a line iteratively
我正在嘗試獲取文件的列名並迭代地打印它們。 我猜問題出在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
但是我得到的輸出是黑屏。
您最好只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次,而您不需要單個外部進程。 希望這可以幫助!
您可以使用awk本身進行打印:
awk 'NR==1{for (i=2; i<=5; i++) print $i}' smaller.txt
代碼的主要問題是分配語法錯誤。 更改此:
set snp = head -n 1 smaller.txt | awk '{print $i}'
對此:
snp=$(head -n 1 smaller.txt | awk '{print $i}')
那是:
set
。 set
用於設置外殼程序選項,編號參數等,而不用於分配任意變量。 =
周圍的空格。 $(...)
(或`...`
,但是$(...)
不太容易出錯)。 也就是說,我同意gniourf_gniourf的方法。
這是另一種選擇。 不一定比其他任何一個更好或更糟:
for n in $(head smaller.txt)
do
echo ${n}
done
somthin喜歡
for x1 in $(head -n1 smaller.txt );do
echo $x1
done
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.