从文本文件中按行读取内容,按照每行内容的字符串长度进行逆序排序输出。对于相同字符串长度的内容那个,按照行首字符的字典序进行逆序排序。

2023-04-26by@c4pr1c3&@gnu-bash.Model: gpt-3.5
c4pr1c3

你是一个 GNU Bash 编程专家,你的任务是根据我的需求描述编写一段可以完成需求的 GNU Bash 代码。如果没有特别说明,需要适配的是运行在 Ubuntu 系统中的 GNU bash 4.0+ 版本的运行环境,常用的 GNU 工具如 grep, awk, find, sed 等都已经安装在系统中了。

Avatar
c4pr1c3

从文本文件中按行读取内容,按照每行内容的字符串长度进行逆序排序输出。对于相同字符串长度的内容那个,按照行首字符的字典序进行逆序排序。

Avatar
Avatar

可以使用 awk 和 sort 命令来完成这个任务。

假设要处理的文本文件名为 file.txt,可以使用以下命令:

awk '{print length($0) " " $0}' file.txt | sort -k1,1nr -k2,2dr | cut -d' ' -f2-

解释如下:

  1. awk '{print length($0) " " $0}' file.txt:使用 awk 命令读取文件每行内容,并在每行前面添加一个代表字符串长度的数字和一个空格,输出结果类似于:

    12 hello world
    5 apple
    8 computer
    ...
    
  2. sort -k1,1nr -k2,2dr:使用 sort 命令进行排序,按照第一列(字符串长度)的逆序和第二列(行首字符的字典序)的逆序排序。

  3. cut -d' ' -f2-:使用 cut 命令剪切输出结果,去掉第一列(字符串长度)和前面添加的空格,只留下每行的原始内容。

最终的输出结果即为按照要求排序后的每行内容。

c4pr1c3

用bash编写一个图片批处理脚本,实现以下功能:
支持命令行参数方式使用不同功能
支持对指定目录下所有支持格式的图片文件进行批处理
支持以下常见图片批处理功能的单独使用或组合使用
支持对jpeg格式图片进行图片质量压缩
支持对jpeg/png/svg格式图片在保持原始宽高比的前提下压缩分辨率
支持对图片批量添加自定义文本水印
支持批量重命名(统一添加文件名前缀或后缀,不影响原始文件扩展名)
支持将png/svg图片统一转换为jpg格式图片

Avatar
Avatar

这个需求可以通过使用 ImageMagick 工具和 GNU Bash 脚本来实现。

首先需要安装 ImageMagick 工具,可以使用以下命令进行安装:

sudo apt-get install imagemagick

然后,可以使用以下脚本来实现图片批处理的功能:

#!/bin/bash

# 定义帮助信息函数
function usage {
  echo "Usage: $0 [-q quality] [-r resolution] [-w watermark] [-p prefix] [-s suffix] [-j] dir"
  echo "  -q quality:  jpeg图片质量压缩,quality为压缩质量,默认为80"
  echo "  -r resolution: jpeg/png/svg图片压缩分辨率,resolution为分辨率,默认为800x800"
  echo "  -w watermark: 添加文本水印,watermark为水印文本"
  echo "  -p prefix: 统一添加文件名前缀,prefix为前缀文本"
  echo "  -s suffix: 统一添加文件名后缀,suffix为后缀文本"
  echo "  -j: 将png/svg图片转换为jpg格式"
  echo "  dir: 指定图片所在目录"
}

# 默认参数值
quality=80
resolution="800x800"
watermark=""
prefix=""
suffix=""
jpg_format=false

# 处理命令行参数
while getopts ":q:r:w:p:s:j" opt; do
  case $opt in
    q)
      quality=$OPTARG
      ;;
    r)
      resolution=$OPTARG
      ;;
    w)
      watermark=$OPTARG
      ;;
    p)
      prefix=$OPTARG
      ;;
    s)
      suffix=$OPTARG
      ;;
    j)
      jpg_format=true
      ;;
    \?)
      echo "Error: invalid option -$OPTARG" >&2
      usage
      exit 1
      ;;
    :)
      echo "Error: option -$OPTARG requires an argument" >&2
      usage
      exit 1
      ;;
  esac
done

# 获取图片目录参数
shift $((OPTIND-1))
dir=$1

# 检查图片目录是否存在
if [ ! -d "$dir" ]; then
  echo "Error: directory $dir does not exist" >&2
  usage
  exit 1
fi

# 定义支持的图片格式
supported_formats=("jpg" "jpeg" "png" "svg")

# 处理每个图片文件
for file in "$dir"/*; do
  # 检查文件是否是一个普通文件
  if [ -f "$file" ]; then
    # 获取文件扩展名
    ext="${file##*.}"
    # 检查文件是否是支持的图片格式之一
    if [[ "${supported_formats[*]}" =~ "$ext" ]]; then
      # 处理图片压缩
      if [ "$ext" == "jpg" ] || [ "$ext" == "jpeg" ]; then
        # 压缩图片质量
        convert "$file" -quality "$quality" "${prefix}${file##*/}${suffix}.${ext}"
      elif [ "$ext" == "png" ] || [ "$ext" == "svg" ]; then
        # 压缩图片分辨率
        convert "$file" -resize "$resolution" "${prefix}${file##*/}${suffix}.jpg"
      fi
      # 处理文本水印
      if [ -n "$watermark" ]; then
        convert "${prefix}${file##*/}${suffix}.${ext}" -gravity center \
          -pointsize 40 -fill white -annotate +0+0 "$watermark" \
          "${prefix}${file##*/}${suffix}.${ext}"
      fi
      # 处理重命名
      if [ -n "$prefix" ] || [ -n "$suffix" ]; then
        mv "${prefix}${file##*/}${suffix}.${ext}" "${prefix}${file##*/}${suffix}.jpg"
      fi
      # 处理转换格式
      if $jpg_format && [ "$ext" != "jpg" ] && [ "$ext" != "jpeg" ]; then
        convert "${prefix}${file##*/}${suffix}.${ext}" "${prefix}${file##*/}${suffix}.jpg"
        rm "${prefix}${file##*/}${suffix}.${ext}"
      fi
    fi
  fi
done

该脚本通过处理命令行参数来支持不同的功能,可以使用以下命令行参数:

  • -q quality:对 JPEG 格式图片进行质量压缩,quality 为压缩质量,默认值为 80。
  • -r resolution:对 JPEG/PNG/SVG 格式图片进行分辨率压缩,resolution 为分辨率,默认值为 800x800。
  • -w watermark:在图片上添加自定义文本水印,watermark 为水印文本。
  • -p prefix:在文件名前面添加统一的前缀,prefix 为前缀文本。
  • -s suffix:在文件名后面添加统一的后缀,suffix 为后缀文本。
  • -j:将 PNG/SVG 格式图片转换为 JPEG 格式。

可以使用以下命令来运行该脚本:

bash image_processing.sh -q 70 -r 1200x1200 -w "My Watermark" -p "prefix_" -s "_suffix" -j /path/to/images

其中,/path/to/images 为需要处理的图片文件所在的目录。