Linux Bash: 使用awk(substr) 从文件输入获取参数
Linux Bash: Use awk(substr) to get parameters from file input
我有一个这样的 .txt 文件:
'SMb_TSS0303' '171765' '171864' '-' 'NC_003078' 'SMb20154'
'SMb_TSS0302' '171758' '171857' '-' 'NC_003078' 'SMb20154'
我想提取以下参数:
-'SMb'
-'171765'
-'171864'
-'-'(减号)
-> 需要它们不带引号
我正在尝试在 shell 脚本中执行此操作:
#!/bin/sh
file=
cat ""|while read line; do
echo "$line"
parent=$(awk {'print substr($line,[=13=],5)'})
echo "$parent"
done
echos 'SMb
据我了解 awk substr,我认为它会像这样工作:
substr(s, a, b)=>returns b number of chars from string s, starting at position a
首先,我不明白,为什么我可以用 0-5 提取 'Smb,其次,我无法提取我需要的任何其他参数,因为移动开始不起作用。
例如。 $1,6 给出空回声。我希望 Mb_TSS
期望的最终输出:
#!/bin/sh
file=
cat ""|while read line; do
parent=$(awk {'print substr($line,[=15=],5)'})
start=$(awk{'print subtrs($line,?,?')})
end=$(awk{'print subtrs($line,?,?')})
strand=$(awk{'print subtrs($line,?,?')})
done
echo "$parent" -> echos SMb
echo "$start" -> echos 171765
echo "$end" -> echos 171864
echo "$strand" -> echos -
我有一个假设,行中的项目被视为单个字符串之类的?也许我也错误地处理了文件解析,但我尝试的一切都不起作用。
真的不清楚你到底想做什么。但我至少可以用 awk
语法帮助你:
while read -r line
do
parent=$(echo $line | awk '{print substr(,2,3)}')
start=$(echo $line | awk '{print substr(,2,6)}')
echo $parent
echo $start
done < file
这输出:
SMb
171765
SMb
171758
您应该能够弄清楚如何获取其余字段。
这是一种非常低效的方法,但根据问题中的信息,我目前无法提供更好的答案。
问题最初被标记为 python,所以让我提出一个 python 解决方案:
with open("input.txt") as f:
for l in txt:
data = [x.strip("'").partition("_")[0] for x in l.split()[:4]]
print("\n".join(data))
它打开文件,像 awk
那样拆分行,只考虑前 4 个字段,去掉引号,创建列表。然后用换行符分隔显示。
打印:
SMb
171765
171864
-
SMb
171758
171857
-
我有一个这样的 .txt 文件:
'SMb_TSS0303' '171765' '171864' '-' 'NC_003078' 'SMb20154'
'SMb_TSS0302' '171758' '171857' '-' 'NC_003078' 'SMb20154'
我想提取以下参数:
-'SMb'
-'171765'
-'171864'
-'-'(减号)
-> 需要它们不带引号
我正在尝试在 shell 脚本中执行此操作:
#!/bin/sh
file=
cat ""|while read line; do
echo "$line"
parent=$(awk {'print substr($line,[=13=],5)'})
echo "$parent"
done
echos 'SMb
据我了解 awk substr,我认为它会像这样工作:
substr(s, a, b)=>returns b number of chars from string s, starting at position a
首先,我不明白,为什么我可以用 0-5 提取 'Smb,其次,我无法提取我需要的任何其他参数,因为移动开始不起作用。 例如。 $1,6 给出空回声。我希望 Mb_TSS
期望的最终输出:
#!/bin/sh
file=
cat ""|while read line; do
parent=$(awk {'print substr($line,[=15=],5)'})
start=$(awk{'print subtrs($line,?,?')})
end=$(awk{'print subtrs($line,?,?')})
strand=$(awk{'print subtrs($line,?,?')})
done
echo "$parent" -> echos SMb
echo "$start" -> echos 171765
echo "$end" -> echos 171864
echo "$strand" -> echos -
我有一个假设,行中的项目被视为单个字符串之类的?也许我也错误地处理了文件解析,但我尝试的一切都不起作用。
真的不清楚你到底想做什么。但我至少可以用 awk
语法帮助你:
while read -r line
do
parent=$(echo $line | awk '{print substr(,2,3)}')
start=$(echo $line | awk '{print substr(,2,6)}')
echo $parent
echo $start
done < file
这输出:
SMb
171765
SMb
171758
您应该能够弄清楚如何获取其余字段。
这是一种非常低效的方法,但根据问题中的信息,我目前无法提供更好的答案。
问题最初被标记为 python,所以让我提出一个 python 解决方案:
with open("input.txt") as f:
for l in txt:
data = [x.strip("'").partition("_")[0] for x in l.split()[:4]]
print("\n".join(data))
它打开文件,像 awk
那样拆分行,只考虑前 4 个字段,去掉引号,创建列表。然后用换行符分隔显示。
打印:
SMb
171765
171864
-
SMb
171758
171857
-