web-dev-qa-db-ja.com

シェルスクリプトの各行から最初の5文字を​​取得します

これは私のsample.txt以下のファイルです

31113    70:54:D2 - a-31003
31114    70:54:D2 - b-31304
31111    4C:72:B9 - c-31303
31112    4C:72:B9 - d-31302

他のスクリプトへの入力IDとして最初の5文字(31113など)を渡すため、シェルスクリプトを作成する必要があります。このために私はこれを試しました

#!/bin/sh
filename='sample.txt'
filelines=`cat $filename`
while read -r line
do
  id= cut -c-5 $line
  echo $id
  #code for passing id to other script file as parameter
done < "$filename"

しかし、これは私にエラーを与えます

cut: 31113: No such file or directory
cut: 70:54:D2 No such file or directory
31114
31111
31112
: No such file or directory

これどうやってするの?

16
user2622247

このようにcutを使用する場合は、次のように redirection _<<<_ (here文字列)を使用する必要があります。

_var=$(cut -c-5 <<< "$line")
_

_id= cut -c-5 $line_の代わりにvar=$(command)式を使用していることに注意してください。これは、コマンドを変数に保存する方法です。

また、_/bin/bash_の代わりに__/bin/sh_を使用して機能させます。


私に働いている完全なコード:

_#!/bin/bash

filename='sample.txt'
while read -r line
do
  id=$(cut -c-5 <<< "$line")
  echo $id
  #code for passing id to other script file as parameter
done < "$filename"
_
26
fedorqui

さて、ワンライナーcut -c-5 sample.txt。例:

$ cut -c-5 sample.txt 
31113
31114
31111
31112

そこから、他のスクリプトまたはコマンドにパイプできます:

$ cut -c-5 sample.txt | while read line; do echo Hello $line; done
Hello 31113
Hello 31114
Hello 31111
Hello 31112
18
tuxdna

echocutにパイプするのではなく、cutの出力をwhileループに直接パイプするだけです。

cut -c 1-5 sample.txt |
while read -r id; do
  echo $id
  #code for passing id to other script file as parameter
done
7
William Pursell

これが必要な場合、awkは空白を自動的に認識できます。

awk '{print $1}' sample.txt
3
BMW

次の簡単な例を確認してください。

while read line; do id=$(echo $line | head -c5); echo $id; done < file

どこ head -c5は、文字列から最初の5文字を​​取得する正しいコマンドです。

3
kenorb

ファイルから最初の列を取得しようとする場合は、awkを試してください。

#!/bin/sh
filename='sample.txt'

while read -r line
do
  id=$(echo $line | awk '{print $1}')
  echo $id
  #code for passing id to other script file as parameter
done < "$filename"
1
vahid abdi

一番上の答えよりもやや単純です:

#!/bin/bash
filename='sample.txt'
while read -r line; do
  id=${line:0:5}
  echo $id
  #code for passing id to other script file as parameter
done < "$filename"
0
Wybo Dekker