18. 常用shell之 cut - 剪切文本文件中的部分 的用法和衍生用法

 cut 是一个在Unix和类Unix系统中常用的命令行工具,它用于剪切文本文件中的部分内容。cut 命令能够按列提取文本文件中的数据,这对于处理由分隔符分隔的数据(如CSV文件)特别有用。

基本用法

基本的cut命令语法如下:

cut [选项]... [文件]...

其中,[选项]可以是以下几种:

  • -d:指定字段的分隔符,默认是制表符(tab)。例如,对于以逗号分隔的CSV文件,可以使用-d,
  • -f:指定要提取的字段,字段编号从1开始。例如,-f1,3表示提取第1和第3个字段。
  • -c:按字符而非字段提取,指定要提取的字符区间。例如,-c1-5表示提取每行的第1到第5个字符。

示例

  1. 提取特定字段

    假设有一个文件data.csv,内容如下:

    name,age,gender
    Alice,30,Female
    Bob,25,Male

    提取第二列(年龄):

    cut -d, -f2 data.csv

    输出将是:

    age
    30
    25

  2. 提取多个字段

    同样的文件,提取第一和第三列(姓名和性别):

    cut -d, -f1,3 data.csv

    输出将是:

    name,gender
    Alice,Female
    Bob,Male

  3. 按字符提取

    提取每行的前5个字符:

    cut -c1-5 data.csv

    如果data.csv的每行如下:

    123456789
    abcdefghi

    则输出将是:

    12345
    abcde

衍生用法

cut 命令通常与其他命令组合使用,以实现更复杂的文本处理。例如:

  • grep组合: 先用grep搜索特定的行,然后用cut提取这些行的某些字段。

    grep "Male" data.csv | cut -d, -f1

    这将会在data.csv中搜索包含"Male"的行,并提取这些行的第一个字段(即名字)。

  • sortuniq等命令组合: 使用cut提取字段,然后对这些字段进行排序或去重。

    cut -d, -f3 data.csv | sort | uniq

    这将会提取第三列(性别),然后对结果进行排序和去重。

注意事项

  • 字段编号是基于指定的分隔符分隔后得到的。
  • 如果没有指定文件,cut命令将从标准输入读取数据。

cut 命令是文本处理中非常有用的工具,尤其是在处理列式数据(如CSV、TSV格式)时。通过与其他命令的组合,可以实现多种强大的文本处理功能

可以使用Java编写一个简单的HDFS Shell程序,以下是可能的实现方式: ```java import java.io.IOException; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.FileSystem; import org.apache.hadoop.fs.Path; public class HShell { private static FileSystem fileSystem; private static Configuration configuration; public static void main(String[] args) throws IOException { configuration = new Configuration(); configuration.set("fs.default.name", "hdfs://localhost:9000"); // 修改为自己的HDFS地址 fileSystem = FileSystem.get(configuration); if (args.length == 0) { System.out.println("请输入命令"); return; } String command = args[0]; switch (command) { case "-cp": { if (args.length != 3) { System.out.println("命令格式错误,请使用-H查看帮助"); return; } String src = args[1]; String dst = args[2]; copyFromLocal(src, dst); break; } case "-rm": { if (args.length != 2) { System.out.println("命令格式错误,请使用-H查看帮助"); return; } String path = args[1]; deleteFile(path); break; } case "-rmr": { if (args.length != 2) { System.out.println("命令格式错误,请使用-H查看帮助"); return; } String path = args[1]; deleteDirectory(path); break; } case "-cp-r": { if (args.length != 3) { System.out.println("命令格式错误,请使用-H查看帮助"); return; } String src = args[1]; String dst = args[2]; copyFromLocalRecursive(src, dst); break; } case "-ls": { if (args.length != 2) { System.out.println("命令格式错误,请使用-H查看帮助"); return; } String path = args[1]; listStatus(path); break; } case "-mv": { if (args.length != 3) { System.out.println("命令格式错误,请使用-H查看帮助"); return; } String src = args[1]; String dst = args[2]; renameFile(src, dst); break; } case "-find": { if (args.length != 3) { System.out.println("命令格式错误,请使用-H查看帮助"); return; } String directory = args[2]; String filename = args[1]; findFile(directory, filename); break; } case "-H": { System.out.println("HShell 使用帮助:\n" + "1. 使用HShell -cp 本地路径 HDFS路径,将文件从Linux本地文件系统拷贝到HDFS指定路径上。\n" + "2. 使用HShell -rm 路径删除文件。\n" + "3. 使用HShell -rmr 路径删除目录。\n" + "4. 使用HShell -cp-r 本地目录路径 HDFS路径,将目录从Linux本地拷贝到HDFS指定路径上。\n" + "5. 使用HShell -ls 路径显示某个文件的信息或者某个目录的信息。\n" + "6. 使用HShell -mv 路径 路径移动文件或者重命名文件。\n" + "7. 使用HShell -find 文件名 目录实现在目录下递归查找某个文件名的文件。"); break; } default: { System.out.println("无效命令,请使用-H查看帮助"); break; } } fileSystem.close(); } private static void copyFromLocal(String src, String dst) throws IOException { fileSystem.copyFromLocalFile(new Path(src), new Path(dst)); System.out.println("文件 " + src + " 已成功上传到 " + dst); } private static void deleteFile(String path) throws IOException { fileSystem.delete(new Path(path), false); System.out.println("文件 " + path + " 已成功删除"); } private static void deleteDirectory(String path) throws IOException { fileSystem.delete(new Path(path), true); System.out.println("目录 " + path + " 已成功删除"); } private static void copyFromLocalRecursive(String src, String dst) throws IOException { fileSystem.copyFromLocalFile(true, true, new Path(src), new Path(dst)); System.out.println("目录 " + src + " 已成功上传到 " + dst); } private static void listStatus(String path) throws IOException { fileSystem.listStatus(new Path(path)).forEach(System.out::println); } private static void renameFile(String src, String dst) throws IOException { fileSystem.rename(new Path(src), new Path(dst)); System.out.println("文件 " + src + " 已成功移动/重命名为 " + dst); } private static void findFile(String directory, String filename) throws IOException { fileSystem.listFiles(new Path(directory), true) .filter(file -> file.getPath().getName().equals(filename)) .forEach(System.out::println); } } ``` 以上程序,我们使用了Hadoop的FileSystem API来实现文件系统操作,具体实现方式如下: 1. 使用copyFromLocalFile()方法将本地文件上传到HDFS。 2. 使用delete()方法删除HDFS的某个文件。 3. 使用delete()方法删除HDFS的某个目录及其下面的所有文件和子目录。 4. 使用copyFromLocalFile()方法将本地目录上传到HDFS。 5. 使用listStatus()方法列出HDFS某个文件或目录的信息。 6. 使用rename()方法重命名或移动HDFS的某个文件。 7. 使用listFiles()方法递归查找HDFS某个目录下的所有文件,并通过filter()方法过滤出文件名为指定名称的文件。 希望以上的实现方式能够对您有所帮助!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值