1

我有一个文本文件,并试图在文件的第一行(或行)中提取数据,其中每个数据都保存为一个列表(因此每个点都保存在它自己的行上)在一个新文件中。

示例数据.txt:

Name  Col  Samp1  Samp2  Samp3  Samp4  Samp5  Samp6
Car1  Red   49.3   43.2   54.3   52.3   12.5   76.8
Car2  Blu   56.3   12.4   85.4   67.1   24.5   32.5
and so on..

我想要一个看起来像这样的新列表,并保存到一个名为 samps.txt 的新文件中:

Samp1
Samp2
Samp3
Samp4
Samp5
Samp6

我对 shell 脚本非常陌生,可以使用任何人可以提供的所有帮助。

4

6 回答 6

2

用于read -a将行读入数组,然后用于for迭代数组元素。有关help更多详细信息,请参阅。

于 2012-11-22T23:26:54.050 回答
2

这可以解决问题:

$ head -1 data.txt | grep -o 'Samp[0-9]*'

Samp1
Samp2
Samp3
Samp4
Samp5
Samp6

解释:

  1. 显示文件的第一行:head -1 data.txt

  2. |获取最后一个命令的输出并将其用作下一个命令的输入(称为管道)。

  3. 打印给定的匹配项regexgrep -o 'Samp[0-9]*'

regex 'Samp[0-9]*'匹配Samp以任何数字开头的任何字符串。

要保存输出以samps.txt使用重定向运算符>

$ head -1 data.txt | grep -o 'Samp[0-9]*' > samps.txt

这将适用于任何列标题,而不仅仅是匹配的列标题'Samp[0-9]*'

$ head -1 data.txt | grep -o '\w*' | tail -n +3 > samps.txt

grep -o '\w*' 匹配单词并tail -n +3显示从第 3 行开始的所有行(即不显示前两列标题)

于 2012-11-22T23:29:06.493 回答
0

将第一行读入变量

read -r FIRSTLINE < filename

将字符串拆分为单词

WORDS=( $FIRSTLINE )

遍历单词并将它们输出到文件

for WORD in ${WORDS[@]}
do
  echo $WORD >> outputfilename
done

在您的情况下,您想要删除前两列值。${WORDS[@]:2您可以在 for 语句中使用对数组进行切片。或者,您可以在将它们回显到文件之前测试 for 循环内的值。

于 2012-11-22T23:36:10.040 回答
0

在处理带有字段的文本文件时,您可能会发现awk是一个很有价值的工具:

awk 'NR==1 { for(i=3;i<=NF;i++) print $i }' file

结果:

Samp1
Samp2
Samp3
Samp4
Samp5
Samp6

解释:

NR is short for the number of rows.
NF is short for the number of fields in the row.
于 2012-11-22T23:53:23.053 回答
0

只需使用 bash:

set -- $(head -1 data.txt)       # save the words in the first line as $1,$2,...
shift 2                          # discard the first two words
printf '%s\n' "$@" > samps.txt   # print each remaining word on its own line
于 2012-11-23T00:57:17.963 回答
0

我赞成 Ignacio Vazquez-Abrams 的回答,因为它是最好的选择,只使用 pure bash. 由于他没有给出一个完整的例子,这里有一个:

read -a samps < "myfile.txt"
printf "%s\n" "${samps[@]:2}"

输出:

Samp1
Samp2
Samp3
Samp4
Samp5
Samp6
于 2012-11-23T07:26:37.897 回答