如何在Linux中提取行并将其另存为文本文件

时间:2019-03-14 13:01:58

标签: linux

我有一个一列500行的数据集,为此,我想提取每一行并将其保存为单独的文件,因此最终得到500个文件。 数据如下:

100002
100003
100004
100005
100006
100007
...

,我希望将这些数字中的每一个存储在各自的文件中。 对于我的编码水平,我可以理解,也许做些类似的事情;

awk -F, 'NR==1 {print $0}'  wholefile.txt> individual1.txt

可以通过手动更改数字来工作,但是如何设置它以遍历每一行并更改要创建的文件,以便它们被唯一命名,例如personal1,individual2等。

例如,打开personal1.txt时会显示100001,但文件名不是“ individual10001”

6 个答案:

答案 0 :(得分:2)

如果您不关心文件名中的结尾.txt,则可以使用split命令

split -l 1 -d -a 3 wholefile.txt individual

这将创建带有顺序编号后缀individual000individual001等的文件,最多不超过wholefile.txt中的行数。数字不取决于wholefile.txt的内容。

请参见man split

-d     use numeric suffixes starting at 0, not alphabetic

-a, --suffix-length=N
          generate suffixes of length N (default 2)

--numeric-suffixes[=FROM]
          same as -d, but allow setting the start value

-l, --lines=NUMBER
          put NUMBER lines/records per output file

选项参数-a 3创建3位数字。您可能必须根据wholefile.txt中的行数来更改此设置。前导零确保文件可以按字典顺序排序。

如果要将数字从1而不是0开头,请将-d替换为--numeric-suffixes=1


如果要删除前导零,可以使用脚本在拆分后重命名文件。您也可以根据需要附加.txt

for file in individual*
do
    newname="$(echo $file|sed 's/\([^0]*\)\(0*\)\([0-9]\)/\1\3/').txt"
    mv "$file" "$newname"
done

sed命令搜索三组

  • [^0]* 0个或多个不是0的字符
  • 0* 0个或更多0字符
  • [0-9]09的数字

,并用第一和第三组代替第二组来替换此模式。 这在这里有效,因为前缀individual不包含数字。否则,sed命令必须被扩展。

答案 1 :(得分:1)

类似这样的东西

count = 0
for i in `cat wholefile.txt`
do
# or let count=count+1
count=$((count+1))
echo $i >> individual$count.txt
done

答案 2 :(得分:0)

这是行号和sed命令的循环,它显示行。输出将按预期写入单个文件。

for i in $(seq 1 $(wc -l wholefile.txt | grep -o '^ *[0-9]\+')); do
    sed -n "${i}p" wholefile.txt > invidividual${i}.txt
done

请注意,对于500个文件,输出文件名格式不正确。您可能需要将以上文件名替换为invidividual$(printf "%03d" ${i}).txt

答案 3 :(得分:0)

纯bash解决方案是

j=0; while read -r line; do echo "$line" > "individual.$((j++)).txt"; done < file

awk解决方案应该是

awk '{f=sprintf("individual.%0.5d.txt",NR); "print > f; close(f) }' file

纯拆分解决方案

split -l 1 -d -a 5 --additional-suffix ".txt" file individual.

答案 4 :(得分:0)

使用for逐行读取文件并用import ast for node in ast.walk(ast.parse(code, '<string>')): if isinstance(node, ast.FunctionDef) and node.name == 'foo': code_obj = compile(ast.fix_missing_locations(ast.Module(body=[node])), '<string>', 'exec') exec(code_obj) print(eval('foo')) 对其进行写入

while read -r line;

答案 5 :(得分:0)

您可以执行以下操作。.


count = 1

cat wholefile.txt | while read line ;
do
    echo $line >> individualtextfile_$count.txt
    count=$[count+1]
done