【问题标题】:Do only if line of text file is not empty仅当文本文件的行不为空时才执行
【发布时间】:2021-02-12 20:35:43
【问题描述】:

我只想在脚本的行不为空时输出。 我已经看到了一些解决方案,但他们使用变量作为行,我不想这样做。

我的脚本:

#!/bin/bash
input="/home/user/scripte/schuelerListe.txt"
while IFS=: read -r vn nn kl
do
    printf 'Vorname: %s, Nachname: %s, Klasse: %s\n' "$vn" "$nn" "$kl"
done <"$input"

txt 文件:

Pyka:Johannes:IT11FS
Gerber:Dennis:IT11FS
Ewender:Laura:IT11FS

Manfred:Rolf:IT11FA
Mammensohn:Friedl:IT11FA
Bittl:Erwin:IT11FA

Wanzinger:Johanna:IT11SE
Summer:Maximilian:IT11SE
Schmied:Burkhard:IT11SE

预期输出:

Vorname: Pyka, Nachname: Joahnnes, Klasse: IT11FS
...
Vorname: Ewender, Nachanem: Laura, Klasse: IT11FS

Vorname: Manfred, Nachname: Rolf, Klasse: IT11FS
...

【问题讨论】:

    标签: bash ubuntu scripting


    【解决方案1】:

    使用 awk:

    awk -F: 'NF == 3 {
       printf "Vorname: %s, Nachname: %s, Klasse: %s\n", $1, $2, $3
    }' file
    
    Vorname: Pyka, Nachname: Johannes, Klasse: IT11FS
    Vorname: Gerber, Nachname: Dennis, Klasse: IT11FS
    Vorname: Ewender, Nachname: Laura, Klasse: IT11FS
    Vorname: Manfred, Nachname: Rolf, Klasse: IT11FA
    Vorname: Mammensohn, Nachname: Friedl, Klasse: IT11FA
    Vorname: Bittl, Nachname: Erwin, Klasse: IT11FA
    Vorname: Wanzinger, Nachname: Johanna, Klasse: IT11SE
    Vorname: Summer, Nachname: Maximilian, Klasse: IT11SE
    Vorname: Schmied, Nachname: Burkhard, Klasse: IT11SE
    

    【讨论】:

    • 如果我使用你的解决方案,输出是: Vorname: Pyka:Johannes:IT11FS, Nachname: Pyka:Johannes:IT11FS, Klasse: Pyka:Johannes:IT11FS 文件的每一行,甚至多次!
    • 我在这个答案中显示了生成的输出,它为每个非空行打印列。你没有得到相同的输出吗?
    【解决方案2】:
    1. 过滤掉空行:

      grep . "$input" | while IFS=: read -r vn nn kl
      do
          printf 'Vorname: %s, Nachname: %s, Klasse: %s\n' "$vn" "$nn" "$kl"
      done
      
    2. 测试变量是否为空:

      while IFS=: read -r vn nn kl
      do
          if [[ -n $vn && -n $nn && -n $kl ]]
          then
              printf 'Vorname: %s, Nachname: %s, Klasse: %s\n' "$vn" "$nn" "$kl"
          fi
      done
      
    3. 将字段读入数组:

      while IFS=: read -ra fields
      do
          if (( ${#fields[*]} != 0 ))
          then
              printf 'Vorname: %s, Nachname: %s, Klasse: %s\n' "${fields[@]}"
          fi
      done
      

    【讨论】:

      猜你喜欢
      • 2020-01-12
      • 1970-01-01
      • 2015-09-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-25
      • 2022-06-29
      相关资源
      最近更新 更多