交换文件夹中所有文件中的前两行

时间:2016-02-24 09:18:50

标签: bash awk swap

我想交换文件夹中所有文件的前两行,并将其保存在现有文件中,保留文件名。

我有什么:

awk '{getline x;print x}1' *.map.txt

这只能写在前两行吗?

这样做只是在终端中打印每个文件的所有输出。

3 个答案:

答案 0 :(得分:1)

你可以用sed:

来做
sed '1{h;d};2{x;H;x}'

说明:

1 and 2 are line number selectors ; the following commands will only be executed on those lines
h puts the current line in the 'hold' buffer
d deletes the line
x swaps the hold buffer with the current line
H appends the current line to the hold buffer

使用GNU sed测试运行:

$ mkdir test35597922
$ echo """line1
> line2
> line3""" > test35597922/file1.txt
$ echo """line1
line2
line3""" > test35597922/file2.txt
$ sed -i '1{h;d};2{x;H;x}' test35597922/*
$ ls test35597922/
file1.txt  file2.txt
$ cat test35597922/file1.txt
line2
line1
line3
$ cat test35597922/file2.txt
line2
line1
line3

如果你不能使用'到位' -i标记并想要编辑文件,您可以按如下方式处理:

for file in test35597922/*; do
  sed '1{h;d};2{x;H;x}' $file > tmp_file
  mv tmp_file $file
done

在某些系统上,它可以在一个操作(sed '1{h;d};2{x;H;x}' $file > $file)中完成,但在其他系统上会失败,文件在完全被读取之前会被覆盖。

答案 1 :(得分:1)

使用ed(和Bash):

for file in ./*; do
    [[ -f $file ]] || continue
    ed -s "$file" <<< $'1m2\nw\nq\n'
done

执行操作的ed命令是:1m2选择第一行并将其移动到第二行。如果你有0行或1行的文件,你会在标准错误上看到一些无害的?。您可以在/dev/null之后添加2> /dev/null,将其重定向到done

答案 2 :(得分:0)

另一个sed

sed -e '1{N;s/^\(.*\)\n\(.*\)/\2\n\1/;}' file

使用-i影响文件中的更改。

如果您没有-i选项,请尝试以下方式。

sed -e '1{N;s/^\(.*\)\n\(.*\)/\2\n\1/;}' file > new_file && mv new_file file